【问题标题】:Axon Testing: Missing Context轴突测试:缺少上下文
【发布时间】:2017-07-18 08:06:41
【问题描述】:

在一个 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.

如何提供测试实现?

【问题讨论】:

    标签: java testing spring-boot axon


    【解决方案1】:

    解决方案 1:模拟

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

    @Test
    void creationSucceeds () {
    
        aggregateTestFixture = new AggregateTestFixture<>(MyAggregate.class);
        aggregateTestFixture.registerInjectableResource(
              Mockito.mock(MyAggregateDao.class));
    
    }
    

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

    这个对我有用:

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

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

    4. 编写启动一个功能齐全的 Spring 容器的 Spring 测试配置:

      @EnableAutoConfiguration
      public class SpringTestConfig {
      
           // Set up whatever you need
      
           @Bean
           @Autowired
           MyAggregateDao myDao (DataSource dataSource) {
      
               // ...
           }
      
      
           @Bean
           @Autowired
           EventStorageEngine eventStorageEngine () {
      
               return new InMemoryEventStorageEngine();
      
           }
      
      }
      
    5. 直接注入你的测试,配置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);
      
      }
      

    使用 jUnit 4

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

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多