轴突测试:缺少上下文

时间:2017-07-18 08:06:41

标签: java testing spring-boot axon

在Axon-SpringBoot应用程序中,我有一个在其某些命令处理程序中使用注入DAO的聚合。

例如:

@Aggregate
class MyAggregate {

    @CommandHandler
    public MyAggregate (CreateMyAggregateCommand command, @Autowired MyAggregateDao dao) {

          final SomeProperty = command.getSomePoprtery();

          if (dao.findBySomeProperty(someProperty) == null) {
               AggregateLifeCycle.apply(
                     new MyAggregateCreatedEvent(command.getIdentifier(),
                                                 someProperty);
          } else {
               // Don't create, already exits with some property
               // report ...
          }
    }

}

标准测试,如

@Test
void creationSucceeds () {

    aggregateTestFixture = new AggregateTestFixture<>(MyAggregate.class);

    final CreateMyAggregateCommand command = new CreateMyAggregateCommand(...);
    final MyAggregateCreatedEvent = new MyAggregateCreatedEvent(...);

    aggregateTestFixture
            .givenNoPriorActivity()
            .when(command)
            .expectEvents(event);

}

失败了:

org.axonframework.test.FixtureExecutionException: No resource of type 
[com.xmpl.MyAggregateDao] has been registered. It is required 
for one of the handlers being executed.

我如何提供测试实施?

1 个答案:

答案 0 :(得分:2)

解决方案1:模拟

由于这是关于单元测试而我的问题涉及数据库调用(外部服务),只要测试仅涉及孤立的聚合行为,模拟似乎是适用的。

@Test
void creationSucceeds () {

    aggregateTestFixture = new AggregateTestFixture<>(MyAggregate.class);
    aggregateTestFixture.registerInjectableResource(
          Mockito.mock(MyAggregateDao.class));

}

解决方案2:实际注入(jUnit 5)

这个适用于我:

  1. this github repo
  2. 获取Spring jUnit5测试支持的小型库
  3. 注释测试类:

    @SpringBootTest(classes = {SpringTestConfig.class}) 
    @ExtendWith(SpringExtension.class)
    public class MyAggregateTest {
    
        // ...        
    
    }
    
  4. 将application.properties放在src / test / resources

  5. 编写Spring Test Test,启动一个功能齐全的Spring容器:

    @EnableAutoConfiguration
    public class SpringTestConfig {
    
         // Set up whatever you need
    
         @Bean
         @Autowired
         MyAggregateDao myDao (DataSource dataSource) {
    
             // ...
         }
    
    
         @Bean
         @Autowired
         EventStorageEngine eventStorageEngine () {
    
             return new InMemoryEventStorageEngine();
    
         }
    
    }
    
  6. 直接注入测试,配置AggregateTestFixture

    private AggregateTestFixture<MyAggregate> aggregateTestFixture;
    
    @Autowired
    private MyAggregateDao myDao;
    
    @BeforeEach
    void beforeEach () {
    
        aggregateTestFixture = new AggregateTestFixture<>(MyAggregate.class);
    
        // We still need to register resources manually
        aggregateTestFixture.registerInjectableResource(myDao);
    
    }
    
  7. 使用jUnit 4

    设置一个使用jUnit 4启动Spring容器的测试配置有点不同,但那里有足够的文档。开始here