当前位置: 首页 > 知识库问答 >
问题:

MissingMethodInvocationException:when()需要一个必须是“mock上的方法调用”的参数

薛祯
2023-03-14

当我尝试运行代码时,它会导致我遇到一个异常。

LoginController.java

@Controller
public class LoginController {@ResponseBody
@RequestMapping(value="/login")
public String login(){
    System.out.println("in login method");
    String s = SampleClass.method();
    System.out.println("String value :  "+s);
    return "welcome to login page";
}}

sampleClass.java

public class SampleClass {

public static String method(){
    System.out.println("in static method");
    return "static method";
}}
@PrepareForTest(SampleClass.class)
public class LoginControllerTest {

private MockMvc mockMvc;

@InjectMocks
private LoginController loginController;


@Before
public void setUp() {

    System.out.println("in setup");
    PowerMockito.mockStatic(SampleClass.class);

    MockitoAnnotations.initMocks(this);
    mockMvc = MockMvcBuilders.standaloneSetup(loginController).build();
    System.out.println("setupdone");

}

@Test
public void loginTest() throws Exception{
    System.out.println("in login test");
    PowerMockito.when(SampleClass.method()).thenReturn("hello");
    mockMvc.perform(get("/login"))
    //.andDo(print())
    .andExpect(status().isOk());
    System.out.println("test completed");
}}

MissingMethodInvocationException:when()需要一个必须是“mock上的方法调用”的参数。例如:when(mock.getarticles()).ThenReturn(articles);

此外,出现此错误的原因可能是:1。您使用final/private/equals()/hashCode()方法中的任一个作为存根。这些方法不能被截取/验证。不支持在非公共父类上声明的模拟方法。2.内部when()不是对mock而是对其他对象调用method。

在org.powermock.api.mockito.powermockito.when(powermockito.java:495)在com.junit.example.controller.logincontrollertest.setup(logincontrollertest.57)在sun.reflect.nativeMethodAccessorImpl.Invoke0(原生方法)在sun.reflect.nativeMethodAccessorImpl.Invoke(未知源)在sun.reflect.delegatingmethodAccessorImpl.Invoke(未知源)ArentRunner.3.在org.junit.runners.ParentRunner.1.在org.junit.runners.ParentRunner.Runchildre(ParentRunner.java:63)在org.junit.runners.ParentRunner.Runchildre(ParentRunner.java:236)在org.junit.runners.ParentRunner.Access$000(ParentRunner.java:53)在org.junit.runners.ParentRunner.229)在org.junit.runners.ParentRunner.229)在

有谁能帮我解决问题吗?

共有1个答案

仇航
2023-03-14

根据文档,您没有正确使用以下内容:https://github.com/powermock/powermock/wiki/mockitousage

从文档中:

  1. 使用@PrepareForTest(static.class)注释类(您没有执行此操作)
  2. 调用mockStaticpowermockito.mockStatic(static.class);
  3. 使用mockito.when()。您正在使用PowerMockito.when()
 类似资料: