以下代码在执行时会在步骤中引发空指针异常:
this.mockMvc.perform
是因为Mockito无法模拟InflowRepository吗?在我写@Mock InflowRepository的行中没有抛出任何错误。 下面的类是测试类
public class MessageTest {
private static Logger LOGGER = LoggerFactory.getLogger(MessageTest.class);
ObjectMapper mapper;
@InjectMocks
private MsgController msgcontroller; //This MessageController class has to be mocked.
@Autowired
private MockMvc mockMvc;
@Mock
private InflowRepository inflowrepository;
@Before
public void setup(){
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(msgcontroller).build();
}
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss",timezone="UTC")
private LocalDateTime nowt=LocalDateTime.now();
@Test
public void testupdate() throws Exception{
Part part = new Part();
part.setDescription("test data");
part.setName("PA17345");
Demand demand= new Demand();
demand.setAmount(10002);
demand.setPart(part);
demand.setDemandId("IEO123");
demand.setDemandTime(nowt);
Order orderp=new Order();
orderp.setDeliveryTime(nowt);
orderp.setComplied(true);
orderp.setSupplierId("Hello Gmbh");
orderp.setOrderId("IEO123");
orderp.setAmount(10002);
orderp.setDemand(demand);
InflowMessage inflow = new InflowMessage();
inflow.setAmount(10002);
inflow.setDeliveryDate(nowt);
inflow.setOrder("OE12345");
Inflow in=new Inflow();
in.setOrder(orderp);
in.setEta(nowt);
in.setAmount(10002);
inflowrepository.save(in);
ObjectMapper mapper = new ObjectMapper().registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
mapper.findAndRegisterModules();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter();
String requestJson=mapper.writeValueAsString(inflow);
System.out.print(requestJson); // This prints the correct
this.mockMvc.perform(post("/api/msg/inflow").content(requestJson).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
verify(inflowrepository, times(1)).findOrderUuid(orderp.getUuid());
verifyNoMoreInteractions(inflowrepository);
}
}
InflowRepository如下所示。在这里,它扩展了CrudRepository并查询数据库。
@Repository
public interface InflowRepository extends CrudRepository<Inflow, UUID> {
@Query("SELECT i FROM Inflow i JOIN Order o on i.order=o.uuid WHERE o.uuid=:order")
List<Inflow> findOrderUuid(@Param("order") UUID order);
@Query("SELECT d FROM Inflow d WHERE d.eta <=:before")
List<Inflow> findInflow(@Param("before") LocalDateTime before);
}
为什么会生成空指针异常?该请求还会打印正确的值。
答案 0 :(得分:0)
如果您使用的是Junit5,请注释@ExtendWith(MockitoExtension.class)
以测试类。
对于Junit4,请注释@RunWith(MockitoJUnitRunner.class)
。