簡體   English   中英

class 中的存根私有方法正在 junit 5 中進行測試,PowerMock 無法與 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;
    }
}

現在我想對ServicefindById方法進行單元測試。 我已經使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM