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

用Mockito注射DozerBeanMapper

庄浩言
2023-03-14

我在Spring服务中使用推土机。如何使用JUnit和Mockito将DozerBeanMapper注入到已测试的服务中?

我的java类(如果简化)看起来像:

@Service
public class UnicornService {
    private final DozerBeanMapper dozer;

    @Autowired
    public UnicornService(DozerBeanMapper dozer) {
        this.dozer = dozer;
    }

    public UnicornDto convert(Unicorn unicorn) {
        return dozer.map(unicorn, UnicornDto.class);
    }
}

使用JUnit 4 Mockito Hamcrest的测试类如下所示:

import static com.shazam.shazamcrest.MatcherAssert.assertThat;
import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;

@RunWith(MockitoJUnitRunner.class)
public class UnicornServiceTest {
    @Mock
    private DozerBeanMapper dozer;
    @InjectMocks
    private UnicornService unicornService;

    @Test
    public void testConvert() throws Exception {
        final Unicorn original = ...
        final UnicornDto expected = ...

        // Execute the method being tested
        final UnicornDto result = unicornService.convert(original);
        // Validation
        assertThat(result, sameBeanAs(expected));
    }
}

问题在于模拟的Dozer实例没有按预期映射对象——默认情况下,Mockito存根返回空或空对象。如果我从测试中删除@Mock注释,它会抛出NPE!

共有3个答案

鲁华皓
2023-03-14

您不应该依赖映射器来创建一个合适的对象,只需要服务调用映射器并返回其结果即可。实际的映射应该在映射器的单元测试中进行测试。Ie

@RunWith(MockitoJUnitRunner.class)
public class UnicornServiceTest {
    @Mock
    private DozerBeanMapper dozer;
    @InjectMocks
    private UnicornService unicornService;

    @Test
    public void testConvert() throws Exception {
        final Unicorn original = mock(Unicorn.class);
        final UnicornDto expected = mock(UnicornDto.class);
        when(dozer.map(original, UnicornDto.class)).thenReturn(expected);

        // Execute the method being tested
        final UnicornDto result = unicornService.convert(original);
        // Validate that the call was delegated to the mapper
        assertThat(result, is(expected));
    }
}
方楷
2023-03-14

我发现的另一个解决方案是重构您的代码。它对我来说似乎不太有吸引力,因为它弊大于利,只是为了编写测试。

在服务中通过setter使用注入

@Service
public class UnicornService {
    private DozerBeanMapper dozer;

    @Autowired
    public setDozer(DozerBeanMapper dozer) {
        this.dozer = dozer;
    }

    public UnicornDto convert(Unicorn unicorn) {
        return dozer.map(unicorn, UnicornDto.class);
    }
}

重构测试:

@RunWith(MockitoJUnitRunner.class)
public class UnicornServiceTest {
    @InjectMocks
    private UnicornService unicornService;

    @Before
    public void injectDozer() {
        final DozerBeanMapper dozer = new DozerBeanMapper();
        unicornService.setDozer(dozer);
    }
    // ...
盖锦程
2023-03-14

在DozerBeanMapper对象上使用Spy注释。这将允许您调用该对象的所有常规方法,同时该对象仍由Mockito(作为一个mock)管理并注入到一个已测试的服务中。

@RunWith(MockitoJUnitRunner.class)
public class UnicornServiceTest {
    @Spy
    private DozerBeanMapper dozer;
    @InjectMocks
    private UnicornService unicornService;
    // ...   
 类似资料:
  • 我正在使用Mockito,并试图将一个Mock CustomFileHandler注入到我的Rejercciiodao类中以进行测试。问题是,我的测试没有抛出任何异常,但它没有注入我的模拟对象,原始的@Autowired CustomFileHandler没有被替换。这是我的代码: 这是我的测试: 顺便说一句,实体按预期工作,接口正确链接到实际实体,我已经测试过了。我该如何解决这个问题?

  • 本文向大家介绍mockito 使用Mockito批注,包括了mockito 使用Mockito批注的使用技巧和注意事项,需要的朋友参考一下 示例 我们要测试的类是: 它的合作者是: 在我们的测试中,我们想打破依赖关系Collaborator及其错误,因此我们将模拟Collaborator。使用@Mock注释是为每个测试创建不同的模拟实例的便捷方法: Mockito将尝试按以下顺序解决依赖项注入:

  • 我正在尝试试驾我正在对我的Android服务进行的一系列更改()-我正在使用Dagger和Robolectric,我需要用一些模拟来替换服务中的字段注入类,以缩小测试范围…使它(稍微)更像“单元”。 我在我的中插入

  • 我正在使用Mockito测试我的spring项目,但是似乎无法将一个模拟服务注入到另一个spring服务(bean)中。 下面是我想测试的spring服务: 下面是我要嘲弄的服务: 我的测试代码在这里: 但结果是 似乎CreateMailboxService没有得到模拟的UserInfoService而是使用了spring的autowired Bean。为什么我的不能工作?

  • 我对摩基托并不陌生,但这次我在工作中发现了一个有趣的案例。我希望你能帮我解决这件事。 我需要注入mock来改变测试过程中的某些方法行为。问题是,bean结构是嵌套的,并且这个bean在其他bean内部,不能从test方法访问。我的代码如下所示: 所以在我的测试中,我希望调用nestedDAO.method返回模拟答案。 我尝试执行一个initmocks: 还要在我的测试类上添加注释: 总是从方法获

  • 我的项目有问题 线程“main”组织中出现异常。jboss。焊接例外情况。DeploymentException:WELD-001408:JpaDAO类型与限定符@Default在注入点[BackedAnnotatedField]@InjectPrivate teste的未满足依赖关系。看法最重要的刀 JpaDAO(仅用于测试,未完全实现): 我的: 还有我的: 我做错了什么?