我是JUnit
新手和自动化测试,我真的想进入自动化测试。这是一个Spring Boot应用程序。我使用了Java Based Annotation样式而不是基于XML的配置。
我有一个测试类,我想在其中测试一个根据用户输入检索响应的方法。
测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleTest(){
@Autowired
private SampleClass sampleClass;
@Test
public void testInput(){
String sampleInput = "hi";
String actualResponse = sampleClass.retrieveResponse(sampleInput);
assertEquals("You typed hi", actualResponse);
}
}
在我的“SampleClass”中,我已经自动装配了这样的bean。
@Autowired
private OtherSampleClass sampleBean;
在我的“OtherSampleClass”中,我注释了一个类似的方法:
@Bean(name = "sampleBean")
public void someMethod(){
....
}
我遇到的问题是当我尝试运行测试而没有@RunWith
和@SpringBootTest
注释时运行测试时,我的变量注释@Autowired
为空。当我尝试使用那些注释运行RunWith& SpringBootTest然后我得到了
BeanCreationException导致的IllegalStateException:创建错误 名为“sampleBean”的bean,无法加载应用程序上下文 由BeanInstantiationException引起。
当我尝试以用户身份使用它时,代码可以“正常”工作,因此我总是可以通过这种方式进行测试,但我认为自动化测试可以延长程序的使用寿命。
我已经使用Spring Boot Testing Docs来帮助我。
答案 0 :(得分:0)
最好尽可能保持unit测试的Spring out 。而不是自动装配你的bean只是将它们创建为常规对象
OtherSampleClass otherSampleClass = mock(OtherSampleClass.class);
SampleClass sampleClass = new SampleClass(otherSampleClass);
但是为此你需要使用构造函数注入而不是Field Injection来提高可测试性。
替换此
@Autowired
private OtherSampleClass sampleBean;
有了这个
private OtherSampleClass sampleBean;
@Autowired
public SampleClass(OtherSampleClass sampleBean){
this.sampleBean = sampleBean;
}
查看其他代码示例的this答案
答案 1 :(得分:0)
以下配置适用于我。
文件:build.gradle
testCompile("junit:junit:4.12")
testCompile("org.springframework.boot:spring-boot-starter-test")
文件:MYServiceTest.java
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest(classes = Application.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
@RunWith(SpringRunner.class)
public class MYServiceTest {
@Autowired
private MYService myService;
@Test
public void test_method() {
myService.run();
}
}
答案 2 :(得分:-1)
无需注入(@Autowired private SampleClass sampleClass;
)您正在测试的实际类,并删除SpringBootTest注释,用于集成测试用例的SpringBootTest注释。
找到以下代码将对您有所帮助。
@RunWith(SpringRunner.class)
public class SampleTest(){
private SampleClass sampleClass;