带有模拟类的JUnit测试

时间:2018-10-19 07:04:49

标签: java junit mockito

我需要为以下方法编写Junit测试用例的解决方案。 所有类都在不同的文件中,我想为类method2的{​​{1}}编写测试用例。

在这种情况下如何使用A

@mock

2 个答案:

答案 0 :(得分:2)

理想情况下,您应该只测试您所关注的层,但是如果要在单个测试用例中调用类A,B和C方法,则可以采用以下解决方案。此解决方案更像集成测试用例。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class TestA {

    @Spy
    @InjectMocks
    private B b = new B();
    @Spy
    private C c = new C();  
    @InjectMocks
    private A a = new A();

    @Test
    public void testMethod1() {
        String val = a.method1("test");
        System.out.println(val);
    }   
}

class A {
    public B b;
    public String method2(String a){
        System.out.println("Inside method A.method2");
        return b.method3(a);
    }
    public String method1(String a){ 
        System.out.println("Inside method A.method1");
        return method2(a);
    }
}

class B {
    public C c;
    public String method3(String a){
        System.out.println("Inside method B.method3");
        return c.method4(a);
    }
}

class C {
    public String method4(String a){
        System.out.println("Inside method C.method4");
        return a;
    }
}

输出将如下所示

Inside method A.method1
Inside method A.method2
Inside method B.method3
Inside method C.method4
test

P.S,您可以使用@Mock而不是spy,然后删除该字段的新运算符,并模拟该类方法的行为。

答案 1 :(得分:1)

有一些工作要做。首先,必须使用某些IoC系统注入依赖类,例如使用@Autowired@Inject

class A{

    @Autowired
    private B b;

    String method1(string a) {
       //some changes applied on a
       return b.method3(a);
    }

    String method2(String a){ 
       return method1(a);
    }
}

然后,您必须模拟以下测试:

@RunWith(MockitoJUnitRunner.class)
public class TestA {

@Mock
private B b;

@InjectMocks
private A a;

public void testMethod1() {

    /* test code here */

    }

}

还认为B应该是接口,而不是具体的类。