当前位置: 首页 > 知识库问答 >
问题:

如何在使用Axon框架时模拟Spring Boot库

谯德元
2023-03-14
@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个答案

何高歌
2023-03-14

Axon中的saga不是Spring托管Bean,尽管使用@autowired注释连接Bean的可能性确实使它看起来如此。为了在您的传奇中连接bean,框架使用ResourceInjector的实现,更具体地说是SpringResourceInjector

现在,这些信息并不一定能解决问题,但可能会给你一个提示,你需要做一些特定的事情来将模拟服务注入到你的传奇中。为了能够使用模拟服务,您需要调用sagatestfixture#registerresource(Object)函数,其中提供的对象就是模拟服务。

我建议setup()作为注册这些资源的理想位置。

 类似资料:
  • 任何关于如何做到这一点的文件都将不胜感激。 提前谢了。

  • 您可以在下面看到我的示例类。 基本上,我希望使用Axon的表来存储事件,并使用我自己的实体表来存储实体。我知道,如果我激发在聚合中处理的,将发布一个事件,之后它将转到,Axon将在其表中持久化该事件。 如何回滚表,还是应该为此使用补偿事件? 我的外部@EventHandler类:

  • 我们有一个使用图形数据库的现有webapplication,我们希望切换到一个使用Axon框架的cqrs的架构。

  • 我试图使用Axon 4.1+中的在一个2 JVM node K8集群上重播事件。虽然我将它设置为清理事件,但它只从一个节点中提取事件,而另一个节点继续运行,因为它的跟踪事件仍然是活动的。 我如何在所有JVM上同时禁用它,以便它能够正确地重播?然后启用所有这些命令,继续处理命令。 我尝试通过这段代码增加线程,这导致了另一个问题,即现有的令牌在InitialSemgmentsCount中永远不会增加,

  • 如何模拟AsNoTracking方法? 在下面的示例中,DbContext已经注入到服务类中,如果我从GetOrderedProducts方法中移除AsNoTracking扩展方法,它可以正常工作,但是with AsNoTracking测试失败,因为它返回null。我还试图模拟AsNoTracking以返回正确的值,但它不起作用。