Как создать тест mockito для ручного внедрения зависимостей - PullRequest
0 голосов
/ 23 апреля 2019

Я создаю ручное внедрение зависимостей, используя Java.Я пытаюсь создать тест Mockito для того же.

Поскольку я новичок в Mockito, я делал только для фреймворка, основанного ранее.Так что вам нужна ваша помощь по приведенному ниже

//All Business logic holder class. It does not have any new operator. Even, it does not have any knowledge about the concrete implementations
class MyClass {

private MyProto a;
private B b;
private C c;

MyClass(MyProtoImpl a, B b, C c) {
 //Only Assignment
 this.a = a;
 this.b = b;
 this.c = c;
}

//Application Logic
public void doSomething() {
 a.startClient(c);
 //Do B specific thing
 //Do C specific thing
 }
}

//The Factory. All the new operators should be placed in this factory class and wiring related objects here.
class MyFactory {
 public MyClass createMyClass() {
   return new MyClass(new AImpl(), new BImpl(), new CImpl());
  }
}

class Main {
 public static void main(String args[]) {
  MyClass mc = new MyFactory().createMyClass();
  mc.doSomething();
 }
}

Итак, наконец, мне нужно добиться двух вещей.

  1. Для проверки класса MyFactory и MyClass
  2. Для проверки MyProtoImplучебный класс.Таким образом, я могу получить весь охват кода.Таким образом, не только MyProtoImpl должен быть покрыт Junit Mockito MyFactory и MyClass также должны быть покрыты

1 Ответ

0 голосов
/ 24 апреля 2019

Обычно вы хотите создать макеты ваших зависимостей. Из комментариев кажется, что вы хотите проверить классы в отделении, поэтому я бы предложил "модульное тестирование" модулей. Я проведу вас через тестирование MyClass.

class MyTestClass {

    // First you want to create mocks of your dependencies
    @Mock
    MyProto a;

    @Mock
    B b;

    @Mock
    C c;

    // At this point Mockito creates mocks of your classes.
    // Calling any method on the mocks (c.doSomething()) would return null if the
    // method had a return type.

    @Test
    void myFirstTest(){
     // 1. Configure mocks for the tests
     // here you configure the mock's returned values (if there are any).
     given(a.someMethod()).willReturn(false);

     // 2. Create the SUT (Software Under Test) Here you manually create the class
     // using the mocks.
     MyClass myClass = new MyClass(a, b, c);

     // 3. Do the test on the service
     // I have assumed that myClass's doSomething simply returns a.someMethod()'s returned value
     boolean result = myClass.doSomething();

     // 4. Assert
     assertTrue(result);
     // Alternatively you can simply do:
     assertTrue(myClass.doSomething());
    }
}

Если ваши классы содержат void методы, вы можете проверить, были ли методы вызваны с правильными аргументами:

     verify(a).someMethod(someParameter);

Это довольно много для Мокито. Вы создаете макеты, устанавливаете желаемое поведение и, наконец, утверждаете результат или проверяете, что методы были вызваны с правильными аргументами.

Однако я не думаю, что это имеет большой смысл для классов "Mockito-test", которые отвечают за соединения с базой данных и аналогичную конфигурацию. Тестирование Mockito ИМХО больше подходит для тестирования сервисного / логического уровня приложения. Если бы у вас был весенний проект, я бы просто протестировал такие классы конфигурации (то есть конфигурацию базы данных и т. Д.) В сценарии, где я установил бы реальное соединение с базой данных.

...