如何在代码流中模拟不同结果的私有方法

问题描述 投票:0回答:2

我的java代码中有一个私有方法,需要调用两次。我正在使用Powermock编写junits。在模拟所述方法时,我需要两个不同的结果用于两个不同的调用。

//我试过了:

PowerMockito.doReturn("MyString1").doReturn("MyString2").when(spy,"getresult",Mockito.anyString());

//但是当()不接受间谍对象以外的任何东西时。

PowerMockito.doReturn("MyString1").doReturn("MyString2").when(spy).getresult(Mockito.anyString());

// when()不允许使用方法getresult,因为此getresult方法被声明为private。

Class A{
String firstString="abc";
String secondString="def";
String result1=getresult(firstString);
String result2=getresult(secondString);

private String getresult(String arg1){
//My code here;
return "AnyString";
}
}

JUNIT

//Declarations
@InjectMocks
A a;
.......
@Test
public void ATest(){
....
/*Suppose I want "MyString1" and "MyString2" as result for calling the method "getresult" for result1 and result2 in Class A*/
A spy=PowerMockito.spy(a);
PowerMockito.doReturn("MyString1").when(spy,"getresult",Mockito.anyString());
....
}
// Please overlook the typos

我在使用我尝试的代码时遇到编译错误。正如代码注释中所写,我期望在代码中显示的两个连续方法调用中有两个结果“MyString1”和“MyString2”。

提前致谢。任何其他方法来实现结果表示赞赏。

java mocking powermock private-methods
2个回答
1
投票

让我首先说明使用PowerMock的主要原因是帮助测试Legacy应用程序。在新的代码中,PowerMock几乎没有地方。在新代码中需要PowerMock表明设计中存在严重问题。

单元测试的一个好处是测试可以为您的设计提供反馈。如果写这样的测试过于尴尬,脆弱或不可能(没有PowerMock)你应该重新考虑你的设计。

测试此类代码可以做的一件事是将私有方法提取到一个单独的类中,并将其作为依赖项提供。然后你可以轻松地模拟它。但是你仍然应该测试提取的逻辑,这取决于你为什么不能首先设置测试。您可能需要集成测试或其他方法。


0
投票

我通常不会单独测试私有方法。它们将通过调用此私有方法的公共方法进行测试。如果存在多个流,则以测试私有方法中的所有代码路径的方式编写多个测试。

但是,以下链接显示了如何测试私有方法。

https://dzone.com/articles/mock-private-method

© www.soinside.com 2019 - 2024. All rights reserved.