0

不幸的是,我的方法没有自动装配 spring bean。我使用了 JGiven 的 0.17.0 版本。

以下测试失败并出现 NullPointerException,因为 HelloWorldStage 类中的 spring bean 'messageService' 为空。

摇篮:

testCompile group: 'com.tngtech.jgiven', name: 'jgiven-junit5', version: '0.17.0'
testCompile group: 'com.tngtech.jgiven', name: 'jgiven-spring', version: '0.17.0'

测试类:

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);
    }
}

春豆:

import org.springframework.stereotype.Service;

@Service
public class MessageService {

    public String createMessage(String recipient) {
        return "Hello " + recipient;
    }
}
4

2 回答 2

1

是的,这是可能的,但是,它目前需要一种解决方法。你必须做以下两件事:

  • 从 jgiven-spring 依赖项中排除 jgiven-junit
  • 创建新的基类 SpringJunit5ScenarioTest 扩展 SpringExtension 和 JGivenExtension,还实现 BeanFactoryAware 以设置场景的舞台创建者。

另请参阅https://github.com/TNG/JGiven/issues/369了解详情。

JGiven 的下一个主要版本将提供开箱即用的 Spring 5 支持。

于 2019-01-20T18:32:45.150 回答
0

摇篮:

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'

待测类:

package mypackage;
import org.springframework.stereotype.Service;

@Service
public class MessageService {   
    public String createMessage(String recipient) {
        return "Hello " + recipient;
    }
}

弹簧配置:

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 {
}

舞台类:

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");
    }
}
于 2019-01-21T07:27:34.927 回答