如何从一个类中模拟一个来自jar(JAVA)的方法

如何从一个类中模拟一个来自jar(JAVA)的方法,java,unit-testing,mockito,junit4,Java,Unit Testing,Mockito,Junit4,我无法解决一个上周一直困扰我的问题 可以模拟一个类,使其位于jar中,这样我就不会调用真正的方法 示例: 3类(类人、类人测试、类人外部jar) 正如我对单元测试的理解,它是在不调用外部方法的情况下隔离类并尝试其行为(这就是我使用mockito的原因) Mockito核心版本1.10.19 JUnit4.12 我希望有人能给我一个解决方案,或者让我看到另一个视角,或者让我明白我可能对概念感到困惑。你需要在Person类中使用PersonalExternalJar公开依赖项来模拟它。一种方法是使用

我无法解决一个上周一直困扰我的问题

可以模拟一个类,使其位于jar中,这样我就不会调用真正的方法

示例:

3类(类人、类人测试、类人外部jar)

正如我对单元测试的理解,它是在不调用外部方法的情况下隔离类并尝试其行为(这就是我使用mockito的原因)

Mockito核心版本1.10.19 JUnit4.12


我希望有人能给我一个解决方案,或者让我看到另一个视角,或者让我明白我可能对概念感到困惑。

你需要在
Person
类中使用
PersonalExternalJar
公开依赖项来模拟它。一种方法是使用构造函数

因此,重构
Person
类如下:

public class Person {

     private final PersonalExternalJar pej;

     public Person (PersonalExternalJar pej) {
         this.pej = pej;
     }

     public void methodA(){
          *do some stuff*
           ArrayList people = pej.doSomething(AnyString,AnyString,AnyObject);
           *do some stuff*
           People2 p = new People2(); //  This class it is somewhere in my project lets say
           String SomePeople = p.doSomeStuff();

     }
}
在应用程序代码中:

new Person(new PersonalExternalJar());
在您的测试中:

PersonalExternalJar pejMocked = mock(PersonalExternalJar.class);
new Person(pejMocked);
您还可以选择使用
set
方法而不是
构造函数

public class Person {
     private PersonalExternalJar pej;

     setPersonalExternalJar(PersonalExternalJar pej) {
         this.pej = pej;
     }
}

这就是已知的情况,当您将代码与无法控制的第三方代码紧密耦合时会发生的情况。将外部依赖项封装在您控制的抽象后面,并显式地将它们注入到依赖类中。使模拟和维护代码更加灵活。@dherik是的,这是一个我可以修改的类。@nkosi这是一个我无法控制的第三方代码,但它允许我们访问数据库。我需要它来耦合我的代码,因为它是强制性的。我不知怎么找到了一种方法来使用和伪造电话。但是谢谢。我认为SpringJUnit4ClassRunner不支持Mockito的Mock和InjectMocks注释。要启用此功能,您需要运行(MockitoJUnitRunner.class)。赋值“pej=newpersonalexternaljar();”似乎没有意义。它将覆盖注入的模拟。您可以在声明中(或在构造函数中)初始化它。@StefanGroßmann您好,谢谢您的回答。抱歉,我想写MockitoJunitRunner.class。我的错误。我不明白的是你所说的pej=PersonalExternalJar()似乎没有什么意义。该类人员需要在某个地方初始化该类,对吗?为了使用他们的方法。Person它是我正在测试的类,里面的其他类,我需要模拟它们。还应该从设计角度添加,如果
PersonalExternalJar
除了一个方法之外没有其他角色,那么它应该显式地注入到方法中,而不是构造函数中。除此之外,你所说的是准确的。我已经试过了。亲自创建构造函数并将PersonalExternalJar作为参数传递。但给我带来问题的是对该类使用@mock注释,或者执行Mockito.mock(PersonalExternalJar.class)。有一个错误,就像我找不到类一样。@Nkosi,你能详细说明一下吗?我总是使用构造函数,因为这样可以更好地显示类的所有依赖项,并且不会因为某些依赖项没有设置而导致出现NPE的风险。我使用了“同时使用构造函数”或“设置”选项。我是新手,但我做了研究。谢谢@mariosalirrosas,什么错误?也许您的项目中存在一些范围问题。
public class Person {
     private PersonalExternalJar pej;

     setPersonalExternalJar(PersonalExternalJar pej) {
         this.pej = pej;
     }
}