junit中的模拟休息服务(带弹簧)
Posted
技术标签:
【中文标题】junit中的模拟休息服务(带弹簧)【英文标题】:Mock rest service (with spring) in junit 【发布时间】:2016-12-24 04:26:51 【问题描述】:我正在编写一个 junit 测试用例来测试其余的调用。
我试图模拟票务服务,它工作正常,但是当我在 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)));
【问题讨论】:
【参考方案1】:问题在于 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。
【讨论】:
非常感谢您指出问题 :) 它有效 :)以上是关于junit中的模拟休息服务(带弹簧)的主要内容,如果未能解决你的问题,请参考以下文章
在带弹簧休息的全局异常处理程序中使用通用异常类处理程序是一种好习惯吗?