Mockito - ложный вызов библиотеки - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть следующая структура

public class classAImpl implements classA {

   public ClassC getTarget(Classc cObj) { 
   // library call
    RegistryLib.init();
    // some more code to construct cObj with more info
    return cObj
  }
}

// Registry Library Class
Class RegistryLibClass{
   public void init() {
   ClassD.builder.build();   
}
}

Мой тестовый класс пытается протестировать метод, который вызывает метод getTarget (), написанный выше.Я хочу полностью избежать выполнения метода getTarget (), который я не смог даже после насмешки над ним.До сих пор я пробовал следующее:

Class Testclass {
   @Before
   public void setUp() {
      Testclass mock = PowerMockito.mock(Testclass.class);
      PowerMockito.when(mock.getTarget(cObj)).thenReturn(cObj);    
  }

 private ClassC getTarget(cObj) {
        return cObj;
    }
}

Любая помощь приветствуется!

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Предполагая, что вы хотите протестировать метод в Class B, который вызывает getTarget из Class A, вы сделаете это,

B b = new B();
A a = Mockito.mock(A.class);
C c = new C();
Mockito.when(a.getTarget(Mockito.any(C.class)).thenReturn(c);
boolean isPresent = b.someMethodToTest();
assertEquals("someMethodToTest was supposed to return true", true/*expected*/, isPresent);

Правка # 1 Вам нужно использовать Powermockito для макетирования статическогоспособ ничего не возвращать, как упоминалось здесь

@PrepareForTest(RegistryLibClass.class) //at the top of the class

//inside your test
PowerMockito.mockStatic(RegistryLibClass.class); 
Mockito.when(RegistryLibClass.init()).doNothing();
0 голосов
/ 08 февраля 2019

Ваш пример очень запутан, поскольку вы пытаетесь смоделировать свой тестовый класс вместо основного класса.

Также вы упомянули, что пытаетесь протестировать метод, который вызывает getTarget ()метод , но я не вижу в вашем классе метода, который бы вызывал getTarget () метод.

Ниже я приведу простой пример для вашего понимания.Дайте мне знать, если это поможет.

ClassA

public class ClassA {
    public String method1() {
        return "ClassA -> method1";
    }

    public static String method2() {
        return "ClassA -> method2";
    }
}

ClassB вызывает методы класса A

public class ClassB {
    public void method1() {
        System.out.println("ClassB -> method1");
        new ClassA().method1();
        ClassA.method2();
    }
}

ClassB Test

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassA.class)
public class ClassBTest {
    @Mock
    ClassA mock;

    @Before
    public void setUp() throws Exception {
        // Initialize mocks
        MockitoAnnotations.initMocks(this);

        // This is for mocking new objects
        PowerMockito.whenNew(ClassA.class).withNoArguments().thenReturn(mock);
        PowerMockito.when(mock.method1()).thenReturn("Mocked Method 1");

        // This is for mocking static methods
        PowerMockito.mockStatic(ClassA.class);
        PowerMockito.when(ClassA.method2()).thenReturn("Mocked Method 2");
    }

    @Test
    public void testMeth() {
        System.out.println(new ClassA().method1()); // Prints - Mocked Method 1

        System.out.println(ClassA.method2()); // Prints - Mocked Method 2
    }
}
0 голосов
/ 08 февраля 2019

Отказ от ответственности - я не очень знаком с mockito, но разве вы не издеваетесь над классом, который хотите избежать?Например:

class Testclass {
   @Before
   public void setUp() {
      //create some mock of expected cObj here to be returned.
      classAImpl mock = PowerMockito.mock(classAImpl.class);
      PowerMockito.when(
         mock.getTarget(cObj.class /*Shouldn't this be class call?*/))
         .thenReturn(cObj);    
  }
}

И тогда вы добавляете макет как зависимость в объект, который его использует, и который вы хотите проверить.

Если я ошибаюсь, не стесняйтесь меня игнорировать, но так работали другие насмешливые библиотеки.Я бы посоветовал вам прочитать некоторые учебные пособия по имитации для тестов, независимо от того.

Как примечание: использование класса и класса в именах сделало этот пример чрезвычайно трудным для понимания.

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