[英]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.