gpt4 book ai didi

java - 如何模拟私有(private)方法以获得代码流中的不同结果

转载 作者:行者123 更新时间:2023-12-02 10:03:43 27 4
gpt4 key购买 nike

我的java代码中有一个私有(private)方法,需要调用两次。我正在使用 Powermock 编写 junit。在模拟上述方法时,我需要两个不同的调用得到两个不同的结果。

//我已经尝试过了:

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

//但是when()不接受除了 spy 对象之外的任何东西。

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”,如代码所示。

提前致谢。任何其他实现结果的方法都值得赞赏。

最佳答案

首先我要指出的是,使用PowerMock的主要原因是帮助测试旧版应用程序。新代码中实际上没有 PowerMock 的位置。新代码中需要 PowerMock 表明设计中存在严重问题。

单元测试的好处之一是测试可以提供有关您的设计的反馈。如果编写此类测试过于尴尬、脆弱或不可能(没有 PowerMock),您应该重新考虑您的设计。

测试此类代码可以执行的操作之一是将私有(private)方法提取到单独的类中并将其作为依赖项提供。然后你就可以轻松 mock 它了。但是您仍然应该测试提取的逻辑,这取决于您为什么无法首先设置测试。您可能需要集成测试或其他一些方法。

关于java - 如何模拟私有(private)方法以获得代码流中的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55454084/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com