Мокито, когда метод не работает

Я использую mockito как насмешливую структуру. У меня есть scenerio здесь, мое когда (abc.method()). ThenReturn (value) не возвращает значение, вместо этого возвращает null.

public class DQExecWorkflowServiceImplTest {
@InjectMocks
DQExecWorkflowServiceImpl dqExecWorkflowServiceImpl = new DQExecWorkflowServiceImpl();
@Mock
private DQUtility dqUtility;
@Mock
private DqExec dqExec;
@Mock
private DqCntlDefn dqCntlDefn;
@Mock
private DqCntlWfDefn dqCntlWfDefn;
@Mock
private DqCntlWfDefnTyp dqCntlWfDefnTyp;
@Mock
private IDQControlWfDefTypeService controlWfDefTypeService;

@Before
public void setUp() throws Exception {
    dqExec = new DqExec();
    dqCntlWfDefn = new DqCntlWfDefn();
    dqUtility = new DQUtility();
    dqCntlWfDefnTyp = new DqCntlWfDefnTyp();
    dqCntlWfDefnTyp.setDqCntlWfDefnTypCd("MIN_INCLUSIVE_VAL");
    dqExecWorkflowServiceImpl
            .setControlWfDefTypeService(controlWfDefTypeService);

}

@Test
public void testExecuteWorkflow() {
    when(controlWfDefTypeService.getDqCntlWfDefnTypCd(dqCntlWfDefn))
            .thenReturn(dqCntlWfDefnTyp);
    dqExecWorkflowServiceImpl.executeWorkflow(dqExec, dqCntlWfDefn);
}

}

Класс Java

@Override
public DqCntlWfExec executeWorkflow(final DqExec dqExec,
        final DqCntlWfDefn dqCntlWfDefn) {
final DqCntlWfExec dqCntlWfExec = new DqCntlWfExec();
dqCntlWfExec.setDqCntlWfExecEffDt(dqUtil.getDefaultEffectiveDt());
dqCntlWfExec.setDqCntlWfExecExpDt(dqUtil.getDefaultExpiryDt());
dqCntlWfExec.setDqCntlWfDefn(dqCntlWfDefn);
dqCntlWfExec.setDqExec(dqExec);

final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService
    .getDqCntlWfDefnTypCd(dqCntlWfDefn);
     String workflowType = null;
if(null!=dqCntlWfDefnTyp){
    workflowType = dqCntlWfDefnTyp.getDqCntlWfDefnTypCd();
}

Когда я запускаю тестовый файл, когда он не работает, и я использую mockito1.8.5 jar в пути сборки. Сервисный вызов высмеивается, но возвращает нулевое значение.

final DqCntlWfDefnTyp dqCntlWfDefnTyp = controlWfDefTypeService
    .getDqCntlWfDefnTypCd(dqCntlWfDefn);

Этот объект dqCntlWfDefnTyp имеет значение null

Я сделал это раньше и не было проблем с тем, когда, похоже, работает с файлами, которые я делал раньше. Я выполнил ту же процедуру для тестового файла, но я не мог понять проблему. Кто-нибудь может помочь мне

Спасибо всем людям заранее

Ответ 1

Mockito mock работает, когда мы глупо обманываем объекты.

Вот изменение, которое я сделал, чтобы заставить его работать:

when(controlWfDefTypeService.getDqCntlWfDefnTypCd(any(DqCntlWfDefn.class))
    .thenReturn(dqCntlWfDefnTyp);

Вместо передачи объекта класса Mock я передал класс с помощью Matcher any() и он работает.

Ответ 2

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

Поскольку вы пытаетесь высмеять 'dqCntlWfDefnTyp' в своем тестовом классе, и сам объект создается в классе, который вы пытаетесь протестировать, вы неизбежно сталкиваетесь с некоторыми проблемами. Основная проблема заключается в том, что объект нельзя издеваться, потому что он воссоздается во время теста.

Есть несколько вариантов, но лучший выбор в моем скромном мнении заключается в использовании PowerMockito. Вы сможете заменить объект в классе, который тестируется, с тем, который вы издеваетесь.

Отличный пример использования PowerMockito из @raspacorp в этом вопросе :

public class MyClass {
void method1{
    MyObject obj1=new MyObject();
    obj1.method1();
}
}

И тестовый класс...

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class MyClassTest {
@Test
public void testMethod1() {      
    MyObject myObjectMock = mock(MyObject.class);
    when(myObjectMock.method1()).thenReturn(<whatever you want to return>);   
    PowerMockito.whenNew(MyObject.class).withNoArguments().thenReturn(myObjectMock);

    MyClass objectTested = new MyClass();
    objectTested.method1();

    ... // your assertions or verification here 
}
}

Ответ 3

У меня была та же проблема. Решением для меня было поставить Mockito.when(...). ThenReturn (...); в метод @Before-SetUp.