Тесты JUnit с классами Mocked - PullRequest
0 голосов
/ 19 октября 2018

Мне нужно решение, чтобы написать контрольный пример Junit для следующего метода.все классы находятся в разных файлах, и я хочу написать контрольный пример для method2 класса A.

Как использовать @mock в этом случае?

class A {
  static String method1(string a)
  {
    B b=new B;
    //some changes applied on a
    return b.method3(a);
  }

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

class B {
  String method3(String a)
  {
    C c=new C();
    //some changes applied on a
    return c.method4(a);
  }
}

class C {
  String method4(String a)
  {
    // some changes applied on a
    return a;
  }
}

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

В идеале, вы должны тестировать только интересующий вас уровень, но если вы хотите вызвать методы классов 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

PS вы можете использовать @Mock вместо spy, затем удалить новый оператор этого поля и смоделировать поведение этого метода класса.

0 голосов
/ 19 октября 2018

Есть работа, которую нужно сделать.Во-первых, зависимый класс должен быть введен с использованием некоторой системы 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 должен быть интерфейсом, а не конкретным классом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...