我试图为我的rest控制器编写测试,并在尝试对NullPointerException
实例执行操作时得到MockMvc
。
我的项目的结构如下:
POJO:
@Entity
public class Pair {
@Id
@JsonIgnore
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String a;
private String b;
//getters and setters...
}
其他控制器:
@RestController
public class PairController {
@Autowired
private PairServiceImpl pairService;
@RequestMapping(value = "/pair", method = RequestMethod.POST)
public Pair addPair(String a, String b) {
Pair newPair = new Pair();
newPair.setA(a);
newPair.setB(b);
return pairService.addNewPair(newPair);
}
@RequestMapping(value = "/pair", method = RequestMethod.GET)
public List<Pair> getPairs() {
return pairService.getPairs();
}
}
服务层:
@Service
public class PairServiceImpl implements PairService {
@Autowired
private PairRepositoryImpl pairRepository;
public Pair addNewPair(Pair newPair) {
return pairRepository.save(newPair);
}
public List<Pair> getPairs() {
return pairRepository.findAll();
}
}
存储库:
public interface PairRepositoryImpl extends JpaRepository<Pair, Long> {
}
我想测试PairController API端点:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {DemoApplication.class, DatabaseConfig.class})
@AutoConfigureMockMvc
@ContextConfiguration(classes = {PairController.class})
public class PairControllerTests {
@Autowired
private MockMvc mockMvc;
@Autowired
private PairService pairService;
@Test
public void addPairTest() {
Pair testPair = new Pair();
testPair.setA("a");
testPair.setB("b");
ObjectMapper objectMapper = new ObjectMapper();
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/pair").accept(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(testPair))).andReturn();
//The line above throws an exception
int status = mvcResult.getResponse().getStatus();
assertEquals(200, status);
}
}
如果我不添加@ContextConfiguration
,则测试将找不到我的端点。
我尝试在调用addPair
方法时记录a和b值,并且两个值均为null
。您还可以看到我添加了一个自定义数据库配置类“ DatabaseConfig
”,该类包含H2嵌入式数据库数据源方法,因此测试不使用生产数据库。 @EnableJpaRepositories
注释存在于此类中,它指向上面显示的存储库。
我尝试处理许多不同的注释,但是它们的最终结果都是相同的:controller方法中的值为null。
我还尝试了在WebApplicationContext上使用MockMvc
手动构建@Autowired
实例,并使用该实例在带有MockMvc
批注的方法中初始化@Before
实例-但最终结果是相同的。
我在PairControllerTests
类中引发异常的行下做了注释。
因此,如果我运行该应用程序并使用Postman和生产数据库对其进行测试,则端点可以正常工作,并且数据可以持久保存并正确检索。此问题仅在测试期间发生。