2017-02-17 3 views
0

Я пытаюсь выполнить тестирование класса с помощью EasyMock. Чтобы упростить ситуацию, я привел пример ниже. Я хочу, чтобы экземпляр StringBuilder был заменен экземпляром EasyMock во время тестирования. (Поскольку это не функциональность StringBuilder, которую я хочу протестировать.) К сожалению, это не работает в приведенном ниже примере. В других тестах у меня есть обходное решение, устанавливая переменные экземпляра с экземпляром EasyMock, но в этом примере я не могу этого сделать, потому что это объект, созданный локально, который мне интересен.Как заменить мои экземпляры Easymock

Кто может мне помочь?

Класс для тестирования:

package example.easymock 

public class Example { 

    public String exampleMethod() { 
     StringBuilder string = new StringBuilder(); 
     string.append("hello"); 
     return string.toString(); 
    } 
} 

Класс тестирования:

package example.easymock 

import needed classes 

public class ExampleTest { 

    @Test 
    public void exampleMethodTest() { 
     StringBuilder stringMock = EasyMock.createMock(); 
     Example example = new Example(); 
     stringMock.append("hello"); 
     EasyMock.expect(stringMock.toString()).andReturn("hi"); 

     EasyMock.replay(stringMock); 

     example.exampleMethod(); 
    } 
} 

ответ

2

Использование только EasyMock это будет невозможно. PowerMock действительно содержит силу, чтобы сделать это, однако:

expectNew(StringBuilder.class).andReturn(stringMock); 

Вы должны настроить конфигурацию PowerMock правильно для того, чтобы работать, конечно - больше here

Это не меняет того факта, что именно эта невозможность что (частично) приводит к широкому принятию Inversion of Control в качестве принципа проектирования. Также, как правило, любой метод, который вы не можете проверить, - это метод, который может быть реорганизован как лучший (и проверяемый). PowerMock следует использовать только для тестов, когда сам код не может быть изменен, чтобы быть лучше.

Это, конечно, предполагает, что StringBuilder - это всего лишь пример, а не буквально то, что вы пытаетесь сделать. Если это так - не беспокойтесь, вы можете предположить, что любые методы, которые являются частью языковых библиотек, работают как рекламируемые.

+0

PowerMock может создавать макет конструкторов классов. Это возможно * с PowerMock. – dav1d

+0

@ dav1d черт возьми, эта вещь мощная, правда. – Deltharis

+0

Просто добавьте, как это сделать с помощью TestNG + PowerMock + Mockito incase полезно: Подготовьте класс, который вы хотите протестировать: '' @PrepareForTest (SomeService.class) ', а затем просто« макет »конструктора:' whenNew (Date . .class) .withNoArguments() thenReturn (сейчас); ' – dav1d

Смежные вопросы