用junit模拟最后一堂课失败

use*_*475 0 java junit powermock powermockito

我正在尝试使用 Powermock 为以下场景编写 junit。我试图编写示例代码,而不是复制不允许在此处发布的确切代码。

 class MainClass{
     First.getC().setStr("abc");
 }

 final class First{
   public static ClassC getC() {
        return c;
    }
 }

class ClassC{
  private String str;
  //getter/setter for str
 }
Run Code Online (Sandbox Code Playgroud)

它总是失败。我的junit如下:

@RunWith(SpringJUnit4ClassRunner.class)
public class MainClassTest {
  @Spy MainClass;

   @Mock
   private ClassC classc;

   @Before
   public void setup() {
     MockitoAnnotations.initMocks(this);
     PowerMockito.mockStatic(First.class);
   }
   @Test
   public void myTest(){
    when(First.getC()).thenReturn(classc);
    Mockito.doCallRealMethod().when(classc).setStr(Mockito.any(String.class)) 
 }
}
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 5

有关于模拟静态方法所需步骤的详细说明

你错过了关键

在测试用例的类级别使用 @PrepareForTest(ClassThatContainsStaticMethod.class) 注释。

除此之外:我认为它仍然行不通,因为第一步说:

在测试用例的类级别使用@RunWith(PowerMockRunner.class) 注释。

这会阻止您使用 Spring runner。

所以,我的建议是:忘记在测试用例中使用需要模拟的静态方法。请记住,无论如何,静态是良好的 OOP 中的异常。因此,不要在静态方法中“修复”行为 - 表示接口中的功能。最坏的情况是,您仍然可以在某些具有静态“单例”实例的类中实现接口,然后将其传递给需要使用该接口的代码。

因为那样你就可以使用普通的 Mockito 来模拟该接口并传递模拟!

长话短说:您编写了难以测试的代码,迫使您考虑 PowerMock - 这将迫使您放弃 Spring 测试运行程序 - 这将使您的生活更难 10 倍。因此,将您的代码更改为易于测试并忘记 PowerMock。