dr *_*rry 8 java spring spring-test
在带有spring例子的cassandra-unit之后,我发现spring bean没有连接到testclass,导致nullpointer异常.我试图最小化问题并发现它可能不是Cassandra部分,而是存在@TestExecutionListeners
注释,以及AbstractTestExecutionListener
扩展类.
org.springframework:spring-core:4.2.0.RELEASE (Also fails with 3.2.14.RELEASE).
org.springframework:spring-test:4.2.0.RELEASE
junit.junit:4.11
JVM vendor/version: Java HotSpot(TM) 64-Bit Server VM/1.8.0_40
MAC OS X 10.10.5
Run Code Online (Sandbox Code Playgroud)
我的TestClass看起来像:
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ AppTestListener.class }) <-- OK when removed
@ContextConfiguration(classes = { TestConfiguration.class })
public class MyTest {
@Autowired
private MyService myService;
@Test
public void testMyService() {
Assert.assertNotNull(myService);
Assert.assertEquals("didit", myService.doIt());
}
}
Run Code Online (Sandbox Code Playgroud)
AppTestListener:
public class AppTestListener extends AbstractTestExecutionListener {
@Override
public void beforeTestMethod(TestContext testContext) throws Exception {
System.out.println("test");
}
}
Run Code Online (Sandbox Code Playgroud)
配置类没什么特别的(配置xml也失败了):
@Configuration
public class TestConfiguration {
@Bean
public MyService myService() {
return new MyService();
}
}
Run Code Online (Sandbox Code Playgroud)
当我在MyTest中删除@TestExecutionListeners注释时,测试按预期完成,但是保留该注释会使assertNotNull上的unittest失败.怎么了?
Sam*_*nen 12
对于初学者来说,遗憾的是cassandra-unit示例并不是一个很好的例子,因为它会像你遇到的那样导致问题.
当我在MyTest中删除@TestExecutionListeners注释时,测试按预期完成,但是保留该注释会使assertNotNull上的unittest失败.怎么了?
当你@TestExecutionListeners(AppTestListener.class)
在一个没有扩展任何其他测试类的测试类上声明时,你实际上是在@TestExecutionListeners
告诉Spring 只加载你的AppTestListener
,当你真正想要AppTestListener
与Spring的默认监听器一起使用时(例如,DependencyInjectionTestExecutionListener
它增加了对依赖的支持)注入豆类ApplicationContext
).
有关详细信息,请阅读Spring参考手册的整个TestExecutionListener配置部分.
以下是解决问题的方法.
在Spring Framework 4.1之前
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TestExecutionListeners({
CassandraUnitTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class
})
@CassandraUnit
public class MyCassandraUnitTest {
@Test
public void xxx_xxx() {
}
}
Run Code Online (Sandbox Code Playgroud)
在Spring Framework 4.1之后
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TestExecutionListeners(
listeners = CassandraUnitTestExecutionListener.class,
mergeMode = MERGE_WITH_DEFAULTS
)
@CassandraUnit
public class MyCassandraUnitTest {
@Test
public void xxx_xxx() {
}
}
Run Code Online (Sandbox Code Playgroud)
问候,
Sam(Spring TestContext Framework的作者)
ps我为Cassandra Unit创建了一个问题,以便他们在他们的例子中解决这个问题.
归档时间: |
|
查看次数: |
2768 次 |
最近记录: |