java - 防止调用构造函数 - Mockito

标签 java junit mockito

假设我有 A 类和 B 类:

public class A {
    private B b;

    public A(String id){
        this.b = new B(id);
    }

    public void doSomethingA(String id){
        // do somethingA
    }

}

public class B{
    public B(String id){
        // call anotherThing (id)
   }

    public void doSomethingB(){
        //somethingB
    }
}

现在我想测试 classA 中的方法(及其实例),但想模拟 classB

Mockito允许我模拟classB,但是当我实例化classA时,构造函数调用classB(我想避免)

有没有办法只模拟构造函数(classA 或 classB)而不模拟其他方法?

最佳答案

您可以 mock 任何 B反对,但你不想。
你想 mock B b A的领域类。
这是不同的。
您必须重构您的设计并执行 B实例化依赖项而不是内部处理。

一种简单的方法是直接传递 B 变量而不是 String作为参数:

public class A {
    private B b;

    public A(B b){
        this.b = b;
    }

    public void doSomethingA(String id){
        // do somethingA
    }

}

现在 mock 是直接的:

@Mock B b;

public void test(){    
  A a = new A(b);
}

另一种方法是使用 Function<String, B> .

public class A {
    private B b;

    public A(Function<String, B> bFunction, String id){
        this.b = bFunction.apply(id);           
    }

    public void doSomethingA(String id){
        // do somethingA
    }

}

mock 变得如此:

@Mock B b;

public void test(){    
   A a = new A(s-> b, "anyValue");
}

实现代码可以将 A 实例化为:

A a = new A(B::new, "id");

关于java - 防止调用构造函数 - Mockito,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48310157/

相关文章:

java - 通过互联网与客户端/服务器应用程序交互的最佳方式?

java - 如何从单元测试中读取资源文件?

java - 如何在java中模拟一个不返回任何内容的函数

java - 乔比 : How to properly unit test a route that returns different content depending on MediaType?

java - 如何将其转换为 Mockito 2.2?

Solaris 10 64 位上的 Cassandra 因 Unsafe_GetLong 崩溃

java - Java中的嵌套并行流

java - 并行执行线程超时

java - 断言检查字符串只包含数值

java - 如何配置和运行 Mockito 测试