Использование mockito для макетирования сервиса с помощью общих методов в - PullRequest
0 голосов
/ 27 ноября 2018

Предполагая, что у меня есть этот репозиторий

@Repository public class GenericHistoryRepositoryImpl implements GenericHistoryRepository {

    @Autowired  private MongoTemplate mongoTemplate;
            @Override   public Historiable create(Historiable historiableObject, String collectionName) {
                mongoTemplate.save(historiableObject, collectionName);
                return historiableObject;   }


    @Override   public <T extends Historiable> T get(String id, Class<T> collectionClass, String collectionName) {
                Query query = new Query();
    query.addCriteria(Criteria.where("id").is(id));
    return mongoTemplate.findOne(query, collectionClass, collectionName);
            } }

И у меня есть этот тест, в котором я собираюсь издеваться над репозиторием, но я не могу понять, как

@RunWith(MockitoJUnitRunner.class)
public class GenericHistoryServiceTest {

    @Mock
    private GenericHistoryRepository genericHistoryRepository;

    @InjectMocks
    private GenericHistoryService genericHistoryService = new GenericHistoryServiceImpl();



    @Test   
        public <T extends Historiable> void getHistoryOk2() throws NotFoundException, ClassNotFoundException {
            String id = "1"

;
        String collectionName = HistoriableCollections.HISTORIABLE_SHIPMENT_REQUEST;
        ShipmentRequest a = mock(ShipmentRequest.class);
        Class<? extends Historiable> clazz = ShipmentRequest.class;
    when(genericHistoryRepository.get(any(String.class), eq(clazz), collectionName)).thenReturn(createExample());


        HistoriableDTO result = genericHistoryService.get(id, HistoriableCollections.HISTORIABLE_SHIPMENT_REQUEST);

        //      verify(genericHistoryRepository, times(1)).get(id, any(), HistoriableCollections.HISTORIABLE_SHIPMENT_REQUEST);

        assertThat(result, is(notNullValue()));          
        assertThat(result.getId(), is(notNullValue()));
    }

Сохранитьпомните, что Historiable является абстрактным классом

public abstract class Historiable {

    public abstract String getParentId();

}

И это расширяет Historiable

@Document(collection = HistoriableCollections.HISTORIABLE_SHIPMENT_REQUEST)
public class ShipmentRequest extends Historiable {

    private String id;

    @Indexed
    private String parentId;

...

}

Моя проблема с предложением «когда», определяющим поведение макета репозитория.У него есть общие методы, которые я не знаю, как имитировать

Class<? extends Historiable> clazz = ShipmentRequest.class;
    when(genericHistoryRepository.get(any(String.class), eq(clazz), collectionName)).thenReturn(createExample());

Я получаю

Метод thenReturn (capture # 1-of? Extends Historiable) вТип OngoingStubbing не применим для аргументов (ShipmentRequest)

private ShipmentRequest createExample() {
        ShipmentRequest history = new ShipmentRequest();
        history.setId("1");

        return history;
    }

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Ваше условие «когда» - это проблема.

Внутри when вы должны определить, когда нужно сопоставить, и после этого вы должны указать, что должно быть возвращено.

Ваше утверждение «когда» начинается хорошо, заявиввы хотите сопоставить любой String, переданный в качестве первого аргумента, но в качестве второго аргумента вы передаете макет, что означает, что он будет срабатывать только в том случае, если этот конкретный макет будет передан в качестве второго аргумента (что, я думаю, не происходит).

Вы можете изменить второй аргумент на: any(Class.class)

Для третьего аргумента вы можете указать, что хотите, чтобы он был равен collectionName, используя: org.mockito.ArgumentMatchers#eq(T)

0 голосов
/ 27 ноября 2018

В вашем тестовом классе вы можете иметь что-то вроде этого

public class TestClass {

@Mock
GenericHistoryRepository genericHistoryRepository;

@InjectMock
MongoTemplate  mongoTemplate;


@Before
public void init() {
    MockitoAnnotations.initMocks(this);
}

}

@InjectMock будет вводить зависимость вашего макета.

...