在我们的项目中,我有模块 scout.client、scout.server、scout.shared 和 backend。
后端对 scout.server 和 scout.shared 没有依赖关系,但 scout.server 对后端有依赖关系。
在后端项目内部,我拥有所有业务逻辑并调用所有外部服务。
我的问题是当我尝试测试使用后端服务的侦察服务时。
因为 scout 提供了一些很好的模拟 bean 的工具,所以我们在后端将我们的服务定义为 bean:
BEANS.getBeanManager().registerClass(CarService.class);
BEANS.getBeanManager().registerClass(PartnerService.class);
CarService.class 和 PartnerService.class 都在后端。
当我尝试编写一些测试并将@BeanMock 添加到测试服务时
@BeanMock
private IPartnerService partnerService;
我得到了模拟,但是每个函数的每个返回都是空的,即使我写
doReturn(PartnerBuilder.standardPartnerListWithOneElement()).when(this.partnerService)
.getPartners(any(Set.class));
如果我在测试中进行调试,在使用调试器调用此测试之前,我可以获得:
partnerService.getPartners(...) -> return a list of person
什么是正确的,但是当被测试的类调用此服务时,它返回 null。
我知道这可能是由于 interface 上缺少注释@ApplicationScoped
。没有这个,就不能保证只bean
创建一个,并且when
声明对该bean的另一个副本做出反应......?
我无法在接口上添加注释,因为后端对侦察模块没有依赖关系。
我怎么能处理这种情况?
测试类是:
public class UtilityPartner {
/**
* Method return service bean for getting partners by ids.
*
* @return
*/
private static IPartnerService getPartnerService() {
return BEANS.get(IPartnerService.class);
}
public static String getPartnerName(final Long partnerId) {
if (partnerId == null) {
return "";
}
final List<Partner> partners =
(List<Partner>) getPartnerService().getPartners(Sets.newHashSet(partnerId));
if (partners == null || partners.isEmpty()) {
return "";
}
final Partner partner = partners.get(0);
return LookupUtil.createLookupDescription(partner.getId(), partner.getName());
}
}
测试类是:
@RunWith(ServerTestRunner.class)
@RunWithSubject("anonymous")
@RunWithServerSession(ServerSession.class)
public class TestUtilityPartner {
@BeanMock
private IPartnerService partnerService;
@Before
public void init() {
doReturn(PartnerBuilder.standardPartnerListWithOneElement()).when(this.partnerService).getPartners(any(Set.class));
}
@Test
public void getPartnerName() {
final String name = UtilityPartner.getPartnerName(10L);
Assert.assertEquals("My name", name); // NAME IS ""
}
}