是否可以将 'JGiven Spring' 与 'JGiven JUnit 5' 合并?
Is it possible to combine 'JGiven Spring' with 'JGiven JUnit 5'?
不幸的是 spring beans 没有用我的方法自动装配。我使用的是 JGiven 的 0.17.0 版本。
以下测试因 NullPointerException 而失败,因为 class HelloWorldStage 中的 spring bean 'messageService' 为空。
Gradle:
testCompile group: 'com.tngtech.jgiven', name: 'jgiven-junit5', version: '0.17.0'
testCompile group: 'com.tngtech.jgiven', name: 'jgiven-spring', version: '0.17.0'
测试Class:
import com.tngtech.jgiven.annotation.ScenarioStage;
import com.tngtech.jgiven.integration.spring.EnableJGiven;
import com.tngtech.jgiven.junit5.JGivenExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@SpringBootTest(classes = {HelloWorldTest.class})
@Configuration
@EnableJGiven
@ComponentScan(basePackages = "sample.jgiven.*")
@ExtendWith(JGivenExtension.class)
class HelloWorldTest {
@ScenarioStage
private HelloWorldStage helloWorldStage;
@Test
void sayHello() {
helloWorldStage
.given().recipient("Bob")
.when().sendMessage()
.then().answer();
}
}
阶段:
import com.tngtech.jgiven.Stage;
import com.tngtech.jgiven.annotation.Quoted;
import com.tngtech.jgiven.annotation.ScenarioState;
import com.tngtech.jgiven.integration.spring.JGivenStage;
import org.springframework.beans.factory.annotation.Autowired;
@JGivenStage
class HelloWorldStage extends Stage<HelloWorldStage> {
@Autowired
private MessageService messageService;
@ScenarioState
private String recipient;
HelloWorldStage recipient(@Quoted String name) {
this.recipient = name;
return self();
}
public HelloWorldStage sendMessage() {
return self();
}
public String answer() {
return messageService.createMessage(recipient);
}
}
Spring豆子:
import org.springframework.stereotype.Service;
@Service
public class MessageService {
public String createMessage(String recipient) {
return "Hello " + recipient;
}
}
是的,这是可能的,但是,目前需要解决方法。你必须做以下两件事:
- 从 jgiven-spring 依赖项中排除 jgiven-junit
- 创建新基础 class SpringJunit5ScenarioTest 扩展 SpringExtension 和 JGivenExtension,还实现 BeanFactoryAware 以设置场景的舞台创建者。
有关详细信息,另请参阅 https://github.com/TNG/JGiven/issues/369。
JGiven 的下一个主要版本将提供 Spring 5 开箱即用的支持。
Gradle:
testCompile group: 'com.tngtech.jgiven', name: 'jgiven-junit5', version: '0.17.0'
testCompile group: 'com.tngtech.jgiven', name: 'jgiven-spring', version: '0.17.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.3.2'
testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.1.1.RELEASE'
Class 正在测试中:
package mypackage;
import org.springframework.stereotype.Service;
@Service
public class MessageService {
public String createMessage(String recipient) {
return "Hello " + recipient;
}
}
Spring配置:
package mypackage;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.tngtech.jgiven.integration.spring.EnableJGiven;
@EnableJGiven
@Configuration
@ComponentScan(basePackages = {"mypackage"})
public class SpringConfig {
}
阶段class:
package mypackage;
import org.springframework.beans.factory.annotation.Autowired;
import com.tngtech.jgiven.Stage;
import com.tngtech.jgiven.annotation.ScenarioState;
import com.tngtech.jgiven.integration.spring.JGivenStage;
import static org.assertj.core.api.Assertions.assertThat;
@JGivenStage
class HelloWorldStage extends Stage<HelloWorldStage> {
@Autowired
private MessageService messageService;
@ScenarioState
private String recipient;
@ScenarioState
private String answer;
HelloWorldStage recipient(String name) {
this.recipient = name;
return self();
}
public HelloWorldStage sendMessage() {
answer = messageService.createMessage(recipient);
return self();
}
public void answerIs(String expectedAnswer) {
assertThat(answer).isEqualTo(expectedAnswer);
}
}
测试:
package mypackage;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = { SpringConfig.class })
public class HelloWorldTest {
@Autowired
private HelloWorldStage helloWorldStage;
@Test
void someTest() {
helloWorldStage
.given().recipient("World")
.when().sendMessage()
.then().answerIs("Hello World");
}
}
不幸的是 spring beans 没有用我的方法自动装配。我使用的是 JGiven 的 0.17.0 版本。
以下测试因 NullPointerException 而失败,因为 class HelloWorldStage 中的 spring bean 'messageService' 为空。
Gradle:
testCompile group: 'com.tngtech.jgiven', name: 'jgiven-junit5', version: '0.17.0'
testCompile group: 'com.tngtech.jgiven', name: 'jgiven-spring', version: '0.17.0'
测试Class:
import com.tngtech.jgiven.annotation.ScenarioStage;
import com.tngtech.jgiven.integration.spring.EnableJGiven;
import com.tngtech.jgiven.junit5.JGivenExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@SpringBootTest(classes = {HelloWorldTest.class})
@Configuration
@EnableJGiven
@ComponentScan(basePackages = "sample.jgiven.*")
@ExtendWith(JGivenExtension.class)
class HelloWorldTest {
@ScenarioStage
private HelloWorldStage helloWorldStage;
@Test
void sayHello() {
helloWorldStage
.given().recipient("Bob")
.when().sendMessage()
.then().answer();
}
}
阶段:
import com.tngtech.jgiven.Stage;
import com.tngtech.jgiven.annotation.Quoted;
import com.tngtech.jgiven.annotation.ScenarioState;
import com.tngtech.jgiven.integration.spring.JGivenStage;
import org.springframework.beans.factory.annotation.Autowired;
@JGivenStage
class HelloWorldStage extends Stage<HelloWorldStage> {
@Autowired
private MessageService messageService;
@ScenarioState
private String recipient;
HelloWorldStage recipient(@Quoted String name) {
this.recipient = name;
return self();
}
public HelloWorldStage sendMessage() {
return self();
}
public String answer() {
return messageService.createMessage(recipient);
}
}
Spring豆子:
import org.springframework.stereotype.Service;
@Service
public class MessageService {
public String createMessage(String recipient) {
return "Hello " + recipient;
}
}
是的,这是可能的,但是,目前需要解决方法。你必须做以下两件事:
- 从 jgiven-spring 依赖项中排除 jgiven-junit
- 创建新基础 class SpringJunit5ScenarioTest 扩展 SpringExtension 和 JGivenExtension,还实现 BeanFactoryAware 以设置场景的舞台创建者。
有关详细信息,另请参阅 https://github.com/TNG/JGiven/issues/369。
JGiven 的下一个主要版本将提供 Spring 5 开箱即用的支持。
Gradle:
testCompile group: 'com.tngtech.jgiven', name: 'jgiven-junit5', version: '0.17.0'
testCompile group: 'com.tngtech.jgiven', name: 'jgiven-spring', version: '0.17.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.3.2'
testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.1.1.RELEASE'
Class 正在测试中:
package mypackage;
import org.springframework.stereotype.Service;
@Service
public class MessageService {
public String createMessage(String recipient) {
return "Hello " + recipient;
}
}
Spring配置:
package mypackage;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.tngtech.jgiven.integration.spring.EnableJGiven;
@EnableJGiven
@Configuration
@ComponentScan(basePackages = {"mypackage"})
public class SpringConfig {
}
阶段class:
package mypackage;
import org.springframework.beans.factory.annotation.Autowired;
import com.tngtech.jgiven.Stage;
import com.tngtech.jgiven.annotation.ScenarioState;
import com.tngtech.jgiven.integration.spring.JGivenStage;
import static org.assertj.core.api.Assertions.assertThat;
@JGivenStage
class HelloWorldStage extends Stage<HelloWorldStage> {
@Autowired
private MessageService messageService;
@ScenarioState
private String recipient;
@ScenarioState
private String answer;
HelloWorldStage recipient(String name) {
this.recipient = name;
return self();
}
public HelloWorldStage sendMessage() {
answer = messageService.createMessage(recipient);
return self();
}
public void answerIs(String expectedAnswer) {
assertThat(answer).isEqualTo(expectedAnswer);
}
}
测试:
package mypackage;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = { SpringConfig.class })
public class HelloWorldTest {
@Autowired
private HelloWorldStage helloWorldStage;
@Test
void someTest() {
helloWorldStage
.given().recipient("World")
.when().sendMessage()
.then().answerIs("Hello World");
}
}