gpt4 book ai didi

java - injectMock 中的 NullPointerException

转载 作者:行者123 更新时间:2023-12-04 08:46:16 26 4
gpt4 key购买 nike

我有一个要测试的 RestController:

import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PetController implements PetApi {

@Autowired
PetRepository pr;

@Override
public ResponseEntity<Pet> addPet(@Valid Pet pet) {
pr.save(new PetBE(9L, "dummy"));
return new ResponseEntity<Pet>(pet, HttpStatus.OK);
}

}
import org.springframework.data.repository.CrudRepository;

public interface PetRepository extends CrudRepository<PetBE, Long> {
}
我想模拟 PetRepository并测试传递的对象是否是返回的对象:
import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

import com.example.petstore.backend.api.model.Pet;
import com.example.petstore.backend.db.PetRepository;
import com.example.petstore.backend.db.PetBE;

import static org.mockito.Mockito.when;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.AdditionalAnswers.returnsFirstArg;

@SpringBootTest
public class PetControllerTest {

@InjectMocks
private PetController petController;

@MockBean
private PetRepository pr;

@Test
void testAddPet() {
when(pr.save(any(PetBE.class))).then(returnsFirstArg());
Pet p1 = new Pet().id(5L).name("Klaus");
assertNotNull(petController);
/*L35*/ ResponseEntity<Pet> r = petController.addPet(p1);
assertEquals(new ResponseEntity<Pet>(p1, HttpStatus.OK), r);
}
}
当我将此方法作为 gradle 测试运行时,我得到
com.example.petstore.backend.api.implementation.PetControllerTest > testAddPet() FAILED
java.lang.NullPointerException at PetControllerTest.java:35
这是 petController.addPet(p1); .
我的 printlnaddPet 中不显示,我不能在那里设置任何断点,因为它是模拟的。 addPet中的唯一引用可能为空的是 pr ,但是当我使用 curl 发送请求时它工作正常。
我也试过添加
    @BeforeAll
public void setup() {
MockitoAnnotations.initMocks(this);
}
因为有人建议 here但这给出了 InitializationException:
com.example.petstore.backend.api.implementation.PetControllerTest > initializationError FAILED
org.junit.platform.commons.JUnitException at LifecycleMethodUtils.java:57

我该如何调试呢?
我怎样才能让它工作?

最佳答案

您在这里混合了来自各种测试框架的注释。如果你想使用 Mockito 注释 @InjectMocks那么我建议不要使用任何与 Spring 相关的模拟注释,而是使用 @Mock注释来创建你想要注入(inject)的 bean 的模拟版本(到 @InjectMocks -annotated 字段中)。还要确保使用 @ExtendWith(MockitoExtension.class) 引导 Mockito 扩展。 .就像是:

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

import com.example.petstore.backend.api.model.Pet;
import com.example.petstore.backend.db.PetRepository;
import com.example.petstore.backend.db.PetBE;

import static org.mockito.Mockito.when;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.AdditionalAnswers.returnsFirstArg;

@ExtendWith(MockitoExtension.class)
public class PetControllerTest {

@InjectMocks
private PetController petController;

@Mock
private PetRepository pr;

@Test
void testAddPet() {
when(pr.save(any(PetBE.class))).then(returnsFirstArg());
Pet p1 = new Pet().id(5L).name("Klaus");
assertNotNull(petController);
ResponseEntity<Pet> r = petController.addPet(p1);
assertEquals(new ResponseEntity<Pet>(p1, HttpStatus.OK), r);
}
}
编辑:调用 MockitoAnnotations.initMocks(this)里面例如 @BeforeEach如果您不想使用 MockitoExtension,则需要使用 -annotated 方法。 .它们本质上是一样的,但在 JUnit Jupiter 中它的必要性较低,因为您可以使用多个扩展来扩展测试类,这在 JUnit 4.x 中是不可能的。因此,如果您想使用 Spring 上下文和 Mockito 引导您的测试,那么您必须选择其中一个并自己设置另一个。

关于java - injectMock 中的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64303841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com