gpt4 book ai didi

java - 使用mockito 来模拟具有通用方法的服务

转载 作者:行者123 更新时间:2023-12-02 10:32:55 29 4
gpt4 key购买 nike

假设我有这个存储库

@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()));
}

请记住,Historable 是一个抽象类

public abstract class Historiable {

public abstract String getParentId();

}

这扩展了历史记录

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

private String id;

@Indexed
private String parentId;

...

}

我的问题是定义存储库模拟行为的“when”句子。它具有我不知道如何模拟的通用方法

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

我懂了

OngoingStubbing 不适用于参数 (ShipmentRequest)

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

return history;
}

最佳答案

你的when子句是问题所在。

when 中,您应该定义何时匹配,然后指定应返回的内容。

您的when语句首先声明您想要匹配作为第一个参数传递的任何String,但作为第二个参数,您传递一个模拟,这意味着它只会在该特定模拟时触发作为第二个参数传递(我认为没有发生)。

您可以将第二个参数更改为:any(Class.class)

对于第三个参数,您可以使用以下方式声明您希望它等于 collectionName:org.mockito.ArgumentMatchers#eq(T)

关于java - 使用mockito 来模拟具有通用方法的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53501423/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com