api测试期间的SpringBoot Nullpointer异常

时间:2018-10-24 12:54:42

标签: java spring spring-boot spring-test

我试图为我的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和生产数据库对其进行测试,则端点可以正常工作,并且数据可以持久保存并正确检索。此问题仅在测试期间发生。

0 个答案:

没有答案