Java 如何模拟在同一类的另一个测试方法中调用的类的方法?

Java 如何模拟在同一类的另一个测试方法中调用的类的方法?,java,mockito,junit4,Java,Mockito,Junit4,例如,有一个类有两个方法methodUnderTest和display,其中methodUnderTest调用display方法。在使用mockito编写junit时,如何模拟display方法 class A{ public int method methodUnderTest{ //some code display(); } public int display(){ //some code } } 你不需要mockito。在测试中,当您创建测试对象时,您可以通过 测

例如,有一个类有两个方法methodUnderTest和display,其中methodUnderTest调用display方法。在使用mockito编写junit时,如何模拟display方法

class A{
public int method methodUnderTest{
   //some code
   display();
}

public int display(){
  //some code
}

}

你不需要mockito。在测试中,当您创建测试对象时,您可以通过

测试不足=新的{ @凌驾 公共整数显示{ 回来 } }
通过这种方式,您可以控制display方法返回什么类型的值。

如果您想使用mockito,我会选择类似的方法:

@嘲弄 私人A; @试验 公开无效测试{ //定义行为 Mockito.whena.display.then返回12; //调用测试下的方法 int res=a.methodUnderTest; //检查你是否得到你想要的 Assert.assertequalsome_值,res; } 如果您不想使用注释,您可以像这样初始化:

A=Mockito.spynew A; 嗯

如果这是你的班级:

    public static class A{
        public int methodUnderTest() {
            return display();
        }

        public int display(){
            return 1;
        }
    }
然后使用mockito,您可以执行以下操作:

        A a = spy(new A());
        when(a.display()).thenReturn(0);
        System.out.println(a.methodUnderTest()); // will print 0
说明:

当您模拟一个类时,没有底层实例,您调用的所有方法都不会执行任何操作并返回默认值,除非另有指定

当您监视一个实例时,所有调用都会被记录下来,并转发到实际实例。这意味着您的类行为将保持完全相同,除非您模拟特定的调用


话虽如此,像您这样的案例通常是一种症状,您需要对该类进行拆分,并投入一些资金。

两者都是公共方法。无论是公共还是私人,都需要对其进行测试,因为它是要测试的类的一部分。如果它是私有的,那么它将通过test下的methods进行测试。您是否尝试过whenspyA.display.thenReturnanyValue?@sandeep私有方法不能被模拟mockito@sandeepOP只是询问如何在测试另一个方法时模拟一个方法。当测试方法处于测试状态时,模拟显示方法并没有害处。也就是说,对显示方法进行测试也是必要的。但这超出了这个问题的范围。我用了你的方式,它对我有效。谢谢然而,我认为最初的否决票是因为你没有在答案中使用Mockito。我现在正在测试这段代码。完成后,我将接受/评论。谢谢你的帮助,泰!仅供参考,我在发布之前在本地测试了这个:有关于测试的消息吗?这对我也很有用。感谢您将Spy方法指向我。此答案中使用的注释不正确。它应该是@Spy而不是@Mock。但是编辑请求被拒绝。@second@Spy和@Mock都可以工作,但它们是不同的东西。查看当您模拟a时,methodUnderTest的调用被替换,并且返回0,当您监视a时,将评估methodUnderTest的真正实现。因为TO想要测试使用模拟测试的方法不正确。您可以通过运行测试轻松地验证这一点。