Mockito 模拟 CassandraOperation Slice 方法

Mockito mock CassandraOperation Slice method

我正在使用Mockito框架编写模拟Junit测试用例下面是我的服务class来测试Junit测试代码

public class UserService {
@Autowired
private CassandraOperations template

public UserDTO getUserDTO(String date, String pagingState) {
        Select select = QueryBuilder.select().all()
                .from("tbl_user");
        select.where(QueryBuilder.eq(date, date));
        select.setFetchSize(30);
        if (pagingState != null) {
            select.setPagingState(PagingState.fromString(pagingState));
        }
        Slice<UserDTO> usgerDTO = template.slice(select, UserDTO.class);
        if(usgerDTO.hasNext()) {
        }
        return usgerDTO.get();
}

测试用例Class写好了

@RunWith(MockitoJUnitRunner.class)    
public class UserServiceTest {

@InjectMocks
    private UserService service ;

    @Mock
    private CassandraOperations template;

    @Mock
    private UserDTO userDTO;
    private String date= "2019-09";
 @Test(expected = Exception.class)
    public void test() {
        Slice<UserDTO>  userDTO= Mockito.mock(Slice.class);
        Select select = Mockito.mock(Select.class);

                Mockito.when(template.slice(select, UserDTO.class)).thenReturn(userDTO);
        metricReportDTO = service.getUserDTO(date, null);


    }
    }

我在这一行得到了 Null 值

Slice<UserDTO> usgerDTO = template.slice(select, UserDTO.class);

你能告诉我如何测试 template.slice 方法吗

注意:我不应该使用 PowerMockito

您的代码片段没有意义,因为您在测试中调用了 service.getMetricsReports(date, null),但您的 UserService 代码示例只有方法 getUserDTO。假设这只是一个拼写错误,那么您需要使用匹配器让模拟在您的 when 中工作。

Mockito.when(template.slice(any(Select.class), eq(UserDTO.class))).thenReturn(userDTO);

这意味着只要第一个参数是 Select 类型的 class 并且第二个参数等于 UserDTO.class 那么 return 如果那些 userDTO 2 个参数不符合这些条件它将 return null.

假设它有一个被覆盖的 equals 方法,您也可以使其与 Select 完全匹配。如果您发送 null pagingState 则类似:

Select stubSelect = QueryBuilder.select().all()
                .from("tbl_user");
        stubSelect.where(QueryBuilder.eq(date, date));
        stubSelect.setFetchSize(30);

Mockito.when(template.slice(eq(stubSelect), eq(UserDTO.class))).thenReturn(userDTO);