我已经做了一个Spring Boot测试来测试JMS消耗。
测试看起来像这样:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
public class UpdateThingByJmsIntegrationTest {
@Test
@Rollback(false)
public void updateThingByJmsUpdatesDatabase() throws InterruptedException {
final Thing thing = new ThingBuilder().withId(null).build();
final TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
transactionTemplate.execute(transactionStatus -> {
thingRepository.save(thing);
return thing;
});
final String xml = String.format(
"<thingDto><id>%s</id><name>something else</name><location>somewhere</location></thingDto>",
thing.getId());
jmsMessagingTemplate.convertAndSend(thingUpdateQueue, xml);
Thread.sleep(1500L);
final Thing updatedThing = thingRepository.getOne(thing.getId());
assertNotNull(updatedThing);
assertEquals("something else", updatedThing.getName());
assertEquals("somewhere", updatedThing.getLocation());
}
因此,我将Thing
保存在数据库中,然后发送JMS消息以更新Thing
。由于JMS消耗发生在与测试本身不同的线程中,因此我等待,然后尝试验证Thing
是否已更新。
这在IntelliJ中工作得很好,但是在Maven中运行它时失败了,因为消耗JMS消息的线程无法在数据库中找到Thing
。
我尝试在测试和使用JMS消息的代码中输出ThingRepository
的对象哈希码(标识符),它们的输出方式不同。与IntelliJ相同。我怀疑这可能是问题的一部分,但我不确定如何避免。
我还检查了IntelliJ vs Maven中的日志输出,发现在测试运行之前maven输出了这些行,而IntelliJ则没有。不知道是否相关。
2019-05-13 09:48:53.983 INFO 9271 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
2019-05-13 09:48:53.995 INFO 9271 --- [ main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2019-05-13 09:48:53.996 INFO 9271 --- [ main] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down'
2019-05-13 09:48:54.000 INFO 9271 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-3 - Shutdown initiated...
2019-05-13 09:48:54.001 INFO 9271 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-3 - Shutdown completed.
但是,为什么在测试中和测试中的类会得到不同的存储库对象?
更新:
事实证明,只有在与另一个测试相同的运行中运行所讨论的测试时,才会发生这种情况。在另一个测试中,我有:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
public class OtherIntegrationTest {
@MockBean
private ThingRepository thingRepository;
看来这“渗漏”了我的其他测试,使上下文在我的测试使用真实交易时使用了模拟。任何避免这种情况的方法,还是我必须找到使用@MockBean的替代方法?
java大神给出的解决方案
这可能是由于缺乏适当的测试隔离引起的。如果updateThingByJmsUpdatesDatabase
测试本身正在运行并且在构建期间作为测试套件的一部分运行时失败,例如使用mvn clean install
运行测试时。
您应该使用Maven通过running this single test进行验证:
mvn test -Dtest=ClassName.updateThingByJmsUpdatesDatabase
Spring MVC:如何获取请求的处理程序方法 - java我正在尝试根据Spring @RequestMapping注释方法上存在的注释实现一些逻辑。因此,我的方法中有一个HttpServletRequest实例,我想问一下spring“给我一个方法,该方法将被调用以处理此请求”,因此我可以使用反射API来询问是否存在我的注释,因此我可以更改处理。有什么简单的方法可以从Spring MVC获取此信息? java大神…
Spring Boot如何在POST之后返回响应 - java我想创建一个新客户并在创建客户后返回客户编号。客户编号必须是从50000开始的自动递增的唯一编号。到目前为止,我已经成功创建了一个客户,但是我不确定应该如何生成客户编号,将其保存到数据库中,并在触发POST时将其作为成功消息显示给用户。json下面是所需的响应;{ "customerNumber": "50002", …
Spring / Hibernate添加了一个在关闭EntityManagerFactory之前运行的关闭挂钩 - java当我关闭服务器时,我有一些工作正在填充我希望允许正常完成的下载和数据填充。我试图添加一个Runtime.getRuntime()。addShutDownHook(),但是它似乎在Entitymanager已关闭后才运行,因为异常在运行之前就开始涌入。然后,我尝试添加它以实现ServletContextListener和@Override public voi…
在Spring Boot中如何在WebSSOProfileConsumerImpl中设置responseSkew属性值 - java我正在尝试将SAML OKTA集成到春季启动应用程序中。我需要在Spring Boot中使用以下bean设置:谁能帮我在Spring Boot的webSSOprofileConsumer bean中设置responseSkew属性。我只需要上面在基于注解的Spring Boot注入中提到的xml配置的等效Spring注入技术。我已经通过链接了:http://…
在Spring Kafka中,我需要在应用程序中添加@EnableKafka批注吗? - java我看到有人在他们的Spring Boot应用程序中添加@EnableKafka,我想知道为什么。我有一个工作的春季靴kafka生产者和使用者,并且没有使用@EnableKafka。那么,为什么人们需要显式添加它?谢谢。 java大神给出的解决方案 这是因为Spring Boot通过KafkaAutoConfiguration类(javadoc)为Kafka提…