![](/img/trans.png)
[英]Mocking a void method in the same class that is under test with mockito and junit5?
[英]Stub private methods in class under test in junit 5, PowerMock not working with JUnit5
我想在被测 class 中存根一个私有方法。 我正在使用junit 5
。 我之前使用过powermock
来实现这一点。 不幸的是junit 5
不适用于powermock
。
我已经简化了示例以更好地解释问题。 我有 class 具有在公共方法中调用的私有辅助方法。 如下所示:
public class Service {
private Repository repository;
public Object findById(String id) {
Object object = repository.findById(id);
object = verify(object);
return object;
}
private Object verify(Object object) {
//removed for simplicity
return object;
}
}
现在我想对Service
的findById
方法进行单元测试。 我已经使用 junit 5 和 mockito 来实现服务 class 的单元测试。
public class ServiceUTest {
@InjectMocks
private Service service;
@Mock
private Repository repository;
@BeforeEach
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testFindById() {
when(repository.findById(Mockito.any())).thenReturn(new Object());
//how to stub verify method
}
}
我将不胜感激任何帮助和指导来解决这个问题。
问候,
您可以监视服务并使用PowerMockito
来定义verify()
方法的行为。
public class ServiceUTest {
@InjectMocks
private Service service;
@Mock
private Repository repository;
@BeforeEach
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testFindById() {
// Arrange
Service spyService = spy(service);
when(repository.findById(Mockito.any())).thenReturn(new Object());
PowerMockito.when(spyService, "verify", any()).thenReturn(expectedObjectReturn);
// Act
Object actual = spyService.findById("id");
// Assert
}
}
通常,单元测试应该验证单元的公共接口。
存根私有方法 - 是个坏主意。 在这种情况下,您的测试与实现细节紧密耦合。 通常,您想测试行为而不是实现。
我的建议是从repository
中返回,例如 object,它将以您想要存根的方式符合验证逻辑。
解决此类问题的另一种方法是将有趣的位移到新的 class 中。 因此,您可以将其作为依赖项注入您的服务。 例如,您可以使用规范模式来提取验证逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.