【问题标题】:Unit test, how to test? wanted but not invoked on Mockito.verify单元测试,怎么测试?想要但未在 Mockito.verify 上调用
【发布时间】:2020-10-21 09:46:24
【问题描述】:

我有 GatewayServer.class 带有构造函数和方法:

public class GatewayServer {

    private ResourceConfig resourceConfig = null;

    public GatewayServer(...) {
    
            ...
    
            resourceConfig = new ResourceConfig();

            ...
    }

    public void registerController(Class<?> controller) {
            resourceConfig.register(controller);
    }

我有 GatewayServerTest.class 我想测试是否在 resourceConfig 上调用了 register() 方法,但我不知道如何添加 new ResourceConfig() 的模拟:

@RunWith(MockitoJUnitRunner.class)
public class GatewayServerTest {
    
    @InjectMocks
    GatewayServer gatewayServer;
    
    @Mock
    ResourceConfig resourceConfig;
    
    @Before
    public void setup() {
        gatewayServer = new GatewayServer(...);
    }
    
    @Test
    public void registerControllerTest() {
        
        gatewayServer.registerController(Endpoint.class);
        
        Mockito.verify(resourceConfig, Mockito.atLeastOnce()).register(Mockito.any());
    }  
}

【问题讨论】:

    标签: java junit mockito


    【解决方案1】:

    使用 Mockito 是不可能的,但是你可以使用 PowerMock 来模拟构造函数本身。

    另一种解决方案是不在构造函数中初始化Resource config,而是在原地初始化(如果您没有任何后初始化):

    private ResourceConfig resourceConfig = new ResourceConfig();
    

    在这种情况下,可以使用 Mockito 进行模拟(就像您在测试课程中所做的那样)。

    【讨论】:

    • 使用最后一个解决方案,我将无法验证该方法是否被调用,因为它不是模拟。
    • 你也不应该在测试中初始化GatewayServer(使用new)。它将通过@injectMocks注解实例化,所有的mock都会自动注入其中。
    • 所以,如果你在 setup() 中删除 gatewayServer = new GatewayServer(...);,“验证”将起作用。
    • 我必须添加 MockitoAnnotations.initMocks(this);现在它可以工作了。不需要 PowerMock。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多