Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟在您';我们正在尝试使用JUnit+;莫基托_Java_Junit_Mockito - Fatal编程技术网

Java 如何模拟在您';我们正在尝试使用JUnit+;莫基托

Java 如何模拟在您';我们正在尝试使用JUnit+;莫基托,java,junit,mockito,Java,Junit,Mockito,我想为使用/依赖于另一个类的服务编写一个单元测试。我想做的是模拟依赖类的行为(与该类的实例相反)。正在测试的服务方法在内部使用依赖类(即,依赖类的实例未传递给方法调用),因此,例如,我有一个要测试的服务方法: import DependentClass; public class Service { public void method() { DependentClass object = new DependentClass(); object.s

我想为使用/依赖于另一个类的服务编写一个单元测试。我想做的是模拟依赖类的行为(与该类的实例相反)。正在测试的服务方法在内部使用依赖类(即,依赖类的实例未传递给方法调用),因此,例如,我有一个要测试的服务方法:

import DependentClass;

public class Service {

    public void method() {
        DependentClass object = new DependentClass();
        object.someMethod();
    }
}
在我对服务方法()的单元测试中,我想在DependentClass实例上模拟someMethod(),而不是让它使用真实的实例。我如何在单元测试中设置它

我看到的所有示例和教程都显示了模拟传递到被测试方法中的对象实例,但我没有看到任何显示如何模拟类而不是对象实例的内容


Mockito有这种可能吗(当然有)?

这是一个设计拙劣的问题。您始终可以从包私有构造函数获取参数。 您的代码应该执行如下操作:

public class Service {

    DependentClass object;
    public Service(){
        this.object = new DependentClass();
    }

    Service(DependentClass object){ // use your mock implentation here. Note this is package private only.
     object = object;
    }

    public void method() {        
        object.someMethod();
    }
}

使用
Powermockito
框架和
whenNew(…)
方法很容易。测试示例如下:

   @Test
   public void testMethod() throws Exception {
      DependentClass dependentClass = PowerMockito.mock(DependentClass.class);
      PowerMockito.whenNew(DependentClass.class).withNoArguments().thenReturn(dependentClass);

      Service service = new Service();
      service.method();
   }

希望对您有所帮助

这绝对有可能。另外,您可以看看。是的,看起来Powermock是我需要的。谢谢你指出这一点!我不必创建一个构造函数,其中包含服务将使用的所有可能需要模拟的类的实例。在我的例子中,被测试的方法创建了一些依赖类的实例。我想我真正想知道的是,在运行单元测试时,是否有方法注入模拟类。您可以通过帮助或运行时绑定来实现这一点,但您需要一个服务提供者实现。我想说的是,它偏离了srp@BrianP,如果添加一个包含所有依赖项的构造函数太痛苦了,那么代码就会出现设计问题,并且可能会越来越糟糕。而且,增加功能(比如带来收入的业务内容)将越来越难超过该功能的收益。如果是这样,那么就需要重构。使用有助于组装软件、观察者、依赖倒置、策略等的模式。。。另一方面,我们可以选择最简单的选项,如Poswermock或partial mock,尽管它们对打造一个好的设计没有多大帮助。同意@Brice的观点,对于遗留代码存在这些选项,如果您可以改进代码,那么您应该这样做。因此,如果正在测试的服务,例如创建5个依赖类实例,您必须创建一个构造函数来接受该依赖对象的五个实例,对吗?将依赖类看作是经常创建的通用类型。。。有点像在测试的服务中创建一个整数的多个实例。另外,我要提到的是,我不拥有dependent类,所以我真的无法对它进行更改。我最终做了一些与此非常类似的事情,而且效果非常好!