在junit中模拟rest服务(使用spring)



我正在编写一个用于测试其余调用的单元测试用例。

我试图模拟票证服务,它工作得很好,但当我在REST服务调用中模拟它时。它不嘲弄。

我正在使用springboot, mongodb与REST。

有什么建议可以解决这个问题吗?

@RestController
@RequestMapping("/ticket")
public class TicketRestController 
{
    @Autowired
    public TicketService ticketService;
    @RequestMapping (path = "/all", method = {RequestMethod.GET})
    public List<Ticket> getAllTicket() 
    {
        return ticketService.getAll();
    }
}

public interface TicketService
{
    public List<Ticket> getAll();
}

@Service
public class TicketServiceImpl implements TicketService {
  @Autowired
  TicketRepository ticketRepository;
  public List<Ticket> getAll() {
    return ticketRepository.findAll();
  }
} 

 public interface TicketRepository extends MongoRepository<Ticket, String>                            {
    public List<Ticket> findAll();
 }
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/mongo-repository-context.xml")
@WebAppConfiguration
public class TicketControllerTest extends AbstractTicketTest {
public static final String PATH = "/ticket";
public static final String ALL = PATH + "/all";
public static final String ID = PATH + "/id";
public static final String STATE = PATH + "/state";
public static final String PAYMENT_TYPE = PATH + "/paymentType";
public static final String TABLE_NUMBER = PATH + "/tableNumber";
@Autowired
private WebApplicationContext ctx;
private MockMvc mockMvc;
@Autowired
@InjectMocks
private TicketService ticketService;
@Mock
private TicketRepository ticketRepository;
@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
    ticketRepository.deleteAll();
}
@Test
public void getAllTickets() throws Exception {
    Mockito.when(ticketRepository.findAll()).thenReturn(TicketMockProvider.createTickets());
    this.mockMvc.perform(get(ALL))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.*", hasSize(1)))
            .andExpect(jsonPath("$[0].ticketItems", hasSize(2)));
  }

}

问题是TicketService中使用的TicketRepository不是mockito所模拟的。

测试类中的那个是由Mockito本身实例化的,而TicketService中的那个是由Spring实例化的。

你可以通过改变init方法使它工作:

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
    ticketRepository.deleteAll();
    // new code starts here
   ticketService.setTicketRepository(ticketRepository); // this method needs to be created.
}

这样,您的TicketService实例将使用模拟的ticketRepository。

相关内容

  • 没有找到相关文章

最新更新