Spring Boot中的Mockito不模拟对象

Dev*_*per 5 java unit-testing mockito spring-boot

我有一个简单的测试用例,我在 Spring Boot 应用程序中使用 Mockito。

用户操作.java

...
@Autowired
Validator nameValidator;

private boolean userOperation(String name) {
    NameStats nameStats = nameValidator.validate(name);
    if (!nameStats.isSuccess()) {
        throw new Exception();
    }
    return true;
}
...
Run Code Online (Sandbox Code Playgroud)

验证器.java

public NameStats validate(String name)
{
    NameStats nameStats = new NameStats();
    // code goes here
    return nameStats;
}
Run Code Online (Sandbox Code Playgroud)

测试用例.java

...
@SpringBootTest
@RunWith(SpringRunner.class)
public class ImportFileOperationTest {

    @Mock
    Validator nameValidator;

    @Mock
    NameStats nameStats;

    @InjectMocks
    UserOperation operation;

    @Test
    public void  ConnectorDelegate0Test() {
        Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);
        Mockito.when(nameStats.isSuccess()).thenReturn(true);
        operation.userOperation(restConsumerRequest);
    }

}
...
Run Code Online (Sandbox Code Playgroud)

错误 :

对于上述测试用例,我收到 NullPointerException。在跟踪时,我发现测试中的以下代码行返回空值。

Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);
Run Code Online (Sandbox Code Playgroud)

由于 null 值,当它尝试调用它时nameStats.isSuccess(),它会抛出 nullpointException,即使我已将此函数的响应模拟为true.

问题:1.我是否以正确的方式嘲笑了回应?2.为什么mock函数返回null对象?

更新 :

测试用例.java

@SpringBootTest
@RunWith(SpringRunner.class)
public class ImportFileOperationTest {

    @MockBean
    Validator nameValidator;

    NameStats nameStats;

    @InjectMocks
    @Resource
    UserOperation operation;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void  ConnectorDelegate0Test() {
        nameStats = new nameStats();
        Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);
        Mockito.when(nameStats.isSuccess()).thenReturn(true);
        operation.userOperation(restConsumerRequest);
    }

}
Run Code Online (Sandbox Code Playgroud)

我尝试手动创建对象nameStats并期望validate函数返回该对象,但它仍然返回null

任何帮助,将不胜感激。

Mic*_*hal 10

测试应由 Mockito 驱动或 Spring 驱动。Spring 驱动将具有@SpringBootTest@RunWith(SpringRunner.class)级注释和模拟,将使用 来声明@MockBean或显式实例化Mockito.initMocks。Mockito 驱动的测试将使用 来@RunWith(MockitoJUnitRunner.class)声明@Mock和/或注入模拟@InjectMocks。请注意,当实例在方法内NameStats实例化时,注入没有帮助。new

显示的测试不一定如此@SpringBootTest,因此可以将其编写为 Mockito 驱动的测试,如下所示:

@RunWith(MockitoJUnitRunner.class)
public class ImportFileOperationTest {

@Mock
Validator nameValidator;

@InjectMocks
UserOperation operation;

@Test
public void  connectorDelegateTest() {
    NameStats nameStats = new NameStats();
    nameStats.setStats(Stats.SUCCESS);
    Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);

    operation.userOperation(restConsumerRequest);
}
Run Code Online (Sandbox Code Playgroud)


Gna*_*yam 3

您需要用于@InjectMocks所有类类型,并且@Mock需要用于该类内的所有关联属性。

例子 :

 class Product {

 ProductDetails  productDetails;

 }

 class ProductDetails {

 }
Run Code Online (Sandbox Code Playgroud)

上述类的示例测试用例:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ProductTest {

    @Mock
    ProductDetails productDetails;

    @InjectMocks
    Product product;

}
Run Code Online (Sandbox Code Playgroud)