当前位置: 首页 > 知识库问答 >
问题:

junit中的模拟rest服务(带有spring)

澹台景山
2023-03-14

我正在编写一个junit测试用例来测试rest调用。

我试图嘲笑售票服务,它工作正常,但当我在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个答案

林项明
2023-03-14

问题是,您的票务服务中使用的TicketPository不是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实例将使用模拟的ticketpository。

 类似资料:
  • 我有以下服务: 和其他服务 我有我的Junit 当我在调试模式下运行这个测试时,我看到这个。合同服务。getInfo(multipartFileId) 正在返回我“null”。 我在嘲弄中错在哪里。 我刚刚在JUnit中嘲笑了ContractService。我还需要模拟AccountServiceImpl吗? 编辑:添加saveInCache和getInfo方法

  • 我尝试使用在集成测试套件中测试。 ()调用注入的(),后者使用调用另一个REST服务器。这导致运行测试时出现以下错误。 resourceAccessException:获取“http://test123.com/42/status”的请求时出现I/O错误:test123.com;嵌套异常为java.net.UnknownHostException:test123.com 我使用对本身进行集成测试,

  • 目标是在G-Suite平台中建立一个服务帐户,应用程序可以使用该帐户执行操作,而无需提示用户进行身份验证。 我们遇到的问题与下面的帖子非常相似,但略有不同。 只要我们遵循“模拟”流程,事情就会正常进行。使用模拟,授权规则遵循被模拟的用户。理想情况下,我们希望相应地作用于服务帐户,而不是模拟用户。当我们这样做时,我们经常收到403。 我们已经尽力按照这里的指示去做了: 我们的Java片段与此类似:

  • 我对Spring MVC中的模拟服务有一个问题: 和测试: 问题是,为什么我从真正的服务而不是模拟中得到公司(公司1,公司2): 更新了测试类,删除了setUp并将@Bean更改为@MockBean,但保留@SpringBootTest并且它可以工作: }

  • > 解析某些文件的服务 管理文件系统的ServiceB 我想测试ControllerClass,特别是:

  • 在我的实现类中,我有一个读写锁定义,如下所示, 我在一个名为的方法中使用它, 正如我所说的,是null,但是rwLock是初始化的。请解释Mockito是如何发生这种情况的。理想的方法是什么?