java - 如何将模拟注入(inject)到具有 1 个带参数的构造函数的类中?

标签 java spring mockito

我有以下类(class)(将其压缩以专注于问题而不是显示整个类(class)):

@Component
public class ABCDEF {

    private final Helper helper;
    private final URI uri;

    public ABCDEF(Helper helper, @Value("${endpoint.url}") URI uri) {
        this.helper = helper;
        this.uri = uri;
    }

    public void b(){
        helper.toString();
    }
}

对于其测试,我希望按如下方式注入(inject)模拟,但它不起作用。 帮助程序显示为 null,我最终必须添加一个默认构造函数才能抛出 URI 异常。

请建议解决此问题的方法,以便能够正确注入(inject)模拟。谢谢。

@RunWith(JUnitMockitoRunner.class)
public class ABCDEFTest {

    @Mock
    private Helper helper;

    @InjectMocks
    private ABCDEF abcdef = new ABCDEF(
            helper,
            new URI("test")
    );

    // adding just to be able to throw Exception
    public ABCDEFTest() throws URISyntaxException {
    }

    @Test
    public void b() {
        abcdef.b();
    }
}

注意:使用 Mockito 版本 1.10.19。需要坚持这个版本。

最佳答案

这应该有效:

@RunWith(MockitoJUnitRunner.class)
public class ABCDEFTest {

    @Mock
    private Helper helper;

    private ABCDEF abcdef;

    @Before
    public void setUp() throws URISyntaxException {
        abcdef = new ABCDEF(
                helper,
                new URI("test")
        );
    }


    @Test
    public void b() {
        abcdef.b();
    }
}

或者,您可以在 setUp 方法中初始化模拟,而不是使用 @RunWith:

public class ABCDEFTest {

    private Helper helper;

    private ABCDEF abcdef;

    @Before
    public void setUp() throws URISyntaxException {
        helper = Mockito.mock(Helper.class);
        abcdef = new ABCDEF(
                helper,
                new URI("test")
        );
    }


    @Test
    public void b() {
        abcdef.b();
    }
}

关于java - 如何将模拟注入(inject)到具有 1 个带参数的构造函数的类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60546706/

相关文章:

java,mockito - 我如何找出调用了哪些模拟?

java - 使用 PowerMock 模拟私有(private)方法

java - 将逗号分隔的字符串转换为点分隔的正则表达式模式

java - 学习尝试捕捉

java - 从 application.properties 文件中读取 spring @Retryable 的 maxAttempts

java - Spring Boot YML 中的正则表达式

java - 在 Java GUI 中使一个方法触发另一个方法

Java - JUnit 测试生成器

spring - 没有强制执行表单输入约束?

java - 带有泛型和 Mockito 的 ClassCastException