代码之家  ›  专栏  ›  技术社区  ›  Bartłomiej Adamczyk

如何在使用Axon框架时模拟Spring引导存储库

  •  3
  • Bartłomiej Adamczyk  · 技术社区  · 6 年前

    我目前正在尝试使用Axon框架和Spring Boot实现一些应用程序,我需要为其中一个传奇编写单元测试。 在这个传奇故事中,除了axon的功能外,我还使用了spring boot存储库,我需要为测试模拟它。

    问题是,存储库没有被注入-它总是空的。 我真的很感激在这件事上有任何帮助。

    在下面查找已发布的类:

    传奇故事:

    @Slf4j
    @Saga
    @Service
    public class ValidationSaga {  
    
        @Autowired
        private transient CommandGateway commandGateway;
        private EmployeeRepository employeeRepository;
    
        private String correlationId;
        private String emp1Code;
        private String emp2Code;
        private String emp1Id;
        private String emp2Id;
        private String emp3Id;
        private String emp3Code;
    
        @StartSaga
        @SagaEventHandler(associationProperty = "correlationId")
        public void on(NewMatchingDocumentAggregate.MatchingSubmittedEvent event) {
    
    
            log.debug(">>>    HANDLING IN SAGA");
            log.debug(">>> REPO: ", employeeRepository); //At this point repo is null
    
            this.correlationId = event.getCorrelationId();
            this.emp1Code= event.getEmp1Code();
            this.emp2Code= event.getEmp2Code();
            this.emp1Id= event.getEmp1Id();
            this.emp2Id= event.getEmp2Id();
            this.emp3Id= event.getEmp3Id();
            this.emp3Code= event.getEmp3Code();
    
            if(!employeeRepository.existsById(event.getEmp1Id())) {
                employeeRepository.save(EmployeeEntity.builder()
                    .employeeCode(event.getEmp1Code())
                    .employeeName(null)
                    .isActive(true)
                    .removeFromRole(false)
                    .build());
            }
    
            if(!employeeRepository.existsById(event.getEmp2Id())) {
                employeeRepository.save(EmployeeEntity.builder()
                        .employeeCode(event.getEmp2Code())
                        .employeeName(null)
                        .isActive(true)
                        .removeFromMentorRole(false)
                        .build());
            }
            log.debug(">>> > before gateway");
    
            commandGateway.send(new NewMatchingDocumentAggregate.ApplyContextCommand(
                    this.correlationId, this.emp1Code, this.emp2Code, this.emp1Id, this.emp2Id,
                    this.emp3Id, this.emp3Code));
        }
    
        @EndSaga
        @SagaEventHandler(associationProperty = "correlationId")
        public void on(NewMatchingDocumentAggregate.MatchingDefinedEvent event) {
        }
    }
    

    测试:

    @Slf4j
    @RunWith(MockitoJUnitRunner.class)
    public class ValidationSagaTest {
    
        @Mock
        private EmployeeRepository employeeRepository;
        @InjectMocks
        private ValidationSaga validationSaga;
    
        private FixtureConfiguration fixture;
    
        @Before
        public void setUp() throws Exception {
    
            fixture = new SagaTestFixture<>(ValidationSaga.class);
        }
    
        @Test
        public void shouldSendApplyContextCommand_whenEmployeesExists_givenSomeEvent() {
    
            val correlationId = "correlationId";
            val emp1Code = "emp1Code ";
            val emp2Code = "emp2Code ";
            val emp1Id = "emp1Id ";
            val emp2Id = "emp2Id ";
            val emp3Id = "emp3Id ";
            val emp3Code = "emp3Code ";
    
            when(employeeRepository.existsById(emp1Id)).thenReturn(true);
            when(employeeRepository.existsById(emp2Id)).thenReturn(true);
    
            fixture.givenNoPriorActivity()
                    .whenAggregate(correlationId)
                    .publishes(new NewMatchingDocumentAggregate.MatchingSubmittedEvent(correlationId, emp1Code,
                            emp2Code, emp1Id, emp2Id, emp3Id, emp3Code))
                    .expectActiveSagas(1)
    
                    .expectDispatchedCommands(new NewMatchingDocumentAggregate.ApplyContextCommand(correlationId,
                            emp1Code, emp2Code, emp1Id, emp2Id, emp3Id, emp3Code));
    
        }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Steven    6 年前

    A. Saga in Axon不是Spring管理的Bean,尽管可以使用 @Autowired 对其中的WireBean的注释确实使其看起来如此。 为了将bean连接到您的传奇中,该框架使用 ResourceInjector ,更具体地说 SpringResourceInjector

    现在,这些信息不一定能解决您的问题,但可能会提示您需要做一些特定的事情,以便在您的传奇中注入模拟服务。为了能够使用模拟服务,您需要调用 SagaTestFixture#registerResource(Object) 功能,如果提供 Object 是你的模拟服务。

    我建议 setUp() 成为针对您的情况注册这些资源的理想场所。

    希望这有帮助!