我在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!
您不应该依赖映射器来创建一个合适的对象,只需要服务调用映射器并返回其结果即可。实际的映射应该在映射器的单元测试中进行测试。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));
}
}
我发现的另一个解决方案是重构您的代码。它对我来说似乎不太有吸引力,因为它弊大于利,只是为了编写测试。
在服务中通过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);
}
// ...
在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(仅用于测试,未完全实现): 我的: 还有我的: 我做错了什么?