spring 引导 1.4、spock 和 application.properties
spring boot 1.4, spock and application.properties
我正在尝试使用 Spock 为我的 Spring Boot 1.4.0 编写一些测试,但我的应用程序测试属性文件没有被提取。
我的gradle里有这个:
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
compile 'org.codehaus.groovy:groovy-all:2.4.1'
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.spockframework:spock-spring:1.0-groovy-2.4') {
}
然后我在
中有这个
/src/test/groovy/resources:
# JWT Key
jwt.key=MyKy@99
最后是我的 Spock 测试:
@SpringBootTest(classes = MyApplication.class, webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource("application-test.properties")
public class TokenUtilityTest extends Specification {
@Autowired
private TokenUtility tokenUtility
def "test a valid token creation"() {
def userDetails = new User(username: "test", password: "password", accountNonExpired: true, accountNonLocked: true,
);
when:
def token = tokenUtility.buildToken(userDetails)
then:
token != null
}
}
正在测试这个 class:
@Component
public class TokenUtility {
private static final Logger LOG = LoggerFactory.getLogger( TokenUtility.class );
@Value("${jwt.key}")
private String jwtKey;
public String buildToken(UserDetails user) {
return Jwts.builder()
.setSubject(user.getUsername())
.signWith(SignatureAlgorithm.HS512, jwtKey)
.compact();
}
public boolean validate(String token) {
try {
Jwts.parser().setSigningKey(jwtKey).parseClaimsJws(token);
return true;
} catch (SignatureException e) {
LOG.error("Invalid JWT found: " + token);
}
return false;
}
}
我最初在我的测试中实例化了 TokenUtility,但是 application-test.properties 从未加载(我假设因为 jwtKey 为空)。所以我正在尝试 @Autowired 我的 class 正在测试中,但现在它是空的。
看起来 Spring Boot 1.4 为测试做了很多改变,所以也许我没有正确连接它?
您的测试代码有几处错误;首先,你的依赖关系不好——Spock 1.0 不支持 @SpringBootTest
注释,所以不会初始化上下文,也不会进行 post 处理,因此出现空指针异常:不会自动装配任何内容。
在 Spock 1.1 中添加了对该注释的支持,它仍然是候选版本,因此您必须使用它:
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.6.0'
compile('org.codehaus.groovy:groovy')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.spockframework:spock-core:1.1-groovy-2.4-rc-1')
testCompile('org.spockframework:spock-spring:1.1-groovy-2.4-rc-1')
testCompile group: 'com.h2database', name: 'h2', version: '1.4.192'
}
然后,您的应用程序路径 -test.properties 是错误的,应该是 /application-test.properties
因为它在类路径的根目录中:
@SpringBootTest(classes = DemoApplication.class,
webEnvironment = WebEnvironment.RANDOM_PORT)
@TestPropertySource("/application-test.properties")
public class TokenUtilityTest extends Specification {
@Autowired
TokenUtility tokenUtility
def "test a valid token creation"() {
def userDetails = new User("test", "password", Collections.emptyList());
when:
def token = tokenUtility.buildToken(userDetails)
then:
token != null
}
}
我遇到了类似的问题,但对我来说,解决方案是在使用 [=14= 时将 @Value
注释中的双引号 ".."
更改为单引号 '..'
].请在下面找到示例:
@Value('${jwt.key}')
private String jwtKey;
PS - 这不是问题的确切答案。我将此发布给遇到与我类似问题并最终出现在这里的人。
我正在尝试使用 Spock 为我的 Spring Boot 1.4.0 编写一些测试,但我的应用程序测试属性文件没有被提取。
我的gradle里有这个:
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
compile 'org.codehaus.groovy:groovy-all:2.4.1'
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.spockframework:spock-spring:1.0-groovy-2.4') {
}
然后我在
中有这个/src/test/groovy/resources:
# JWT Key
jwt.key=MyKy@99
最后是我的 Spock 测试:
@SpringBootTest(classes = MyApplication.class, webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource("application-test.properties")
public class TokenUtilityTest extends Specification {
@Autowired
private TokenUtility tokenUtility
def "test a valid token creation"() {
def userDetails = new User(username: "test", password: "password", accountNonExpired: true, accountNonLocked: true,
);
when:
def token = tokenUtility.buildToken(userDetails)
then:
token != null
}
}
正在测试这个 class:
@Component
public class TokenUtility {
private static final Logger LOG = LoggerFactory.getLogger( TokenUtility.class );
@Value("${jwt.key}")
private String jwtKey;
public String buildToken(UserDetails user) {
return Jwts.builder()
.setSubject(user.getUsername())
.signWith(SignatureAlgorithm.HS512, jwtKey)
.compact();
}
public boolean validate(String token) {
try {
Jwts.parser().setSigningKey(jwtKey).parseClaimsJws(token);
return true;
} catch (SignatureException e) {
LOG.error("Invalid JWT found: " + token);
}
return false;
}
}
我最初在我的测试中实例化了 TokenUtility,但是 application-test.properties 从未加载(我假设因为 jwtKey 为空)。所以我正在尝试 @Autowired 我的 class 正在测试中,但现在它是空的。
看起来 Spring Boot 1.4 为测试做了很多改变,所以也许我没有正确连接它?
您的测试代码有几处错误;首先,你的依赖关系不好——Spock 1.0 不支持 @SpringBootTest
注释,所以不会初始化上下文,也不会进行 post 处理,因此出现空指针异常:不会自动装配任何内容。
在 Spock 1.1 中添加了对该注释的支持,它仍然是候选版本,因此您必须使用它:
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.6.0'
compile('org.codehaus.groovy:groovy')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.spockframework:spock-core:1.1-groovy-2.4-rc-1')
testCompile('org.spockframework:spock-spring:1.1-groovy-2.4-rc-1')
testCompile group: 'com.h2database', name: 'h2', version: '1.4.192'
}
然后,您的应用程序路径 -test.properties 是错误的,应该是 /application-test.properties
因为它在类路径的根目录中:
@SpringBootTest(classes = DemoApplication.class,
webEnvironment = WebEnvironment.RANDOM_PORT)
@TestPropertySource("/application-test.properties")
public class TokenUtilityTest extends Specification {
@Autowired
TokenUtility tokenUtility
def "test a valid token creation"() {
def userDetails = new User("test", "password", Collections.emptyList());
when:
def token = tokenUtility.buildToken(userDetails)
then:
token != null
}
}
我遇到了类似的问题,但对我来说,解决方案是在使用 [=14= 时将 @Value
注释中的双引号 ".."
更改为单引号 '..'
].请在下面找到示例:
@Value('${jwt.key}')
private String jwtKey;
PS - 这不是问题的确切答案。我将此发布给遇到与我类似问题并最终出现在这里的人。