Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将mockito与maven测试线束一起使用_Java_Maven_Mockito_Maven Plugin_Maven Plugin Testing Harness - Fatal编程技术网

Java 如何将mockito与maven测试线束一起使用

Java 如何将mockito与maven测试线束一起使用,java,maven,mockito,maven-plugin,maven-plugin-testing-harness,Java,Maven,Mockito,Maven Plugin,Maven Plugin Testing Harness,我现在开发的maven插件使用GoogleGuice和JSR-330注入了一些依赖项。对于单元测试,我使用。这个插件工作得很好。但是测试有一个问题。我想将模拟组件注入mojo,但测试中仍然有真实的对象 我试着按照中所述编写自定义测试模块,但没有成功。经过一些调试,我发现Plexus容器不允许使用自定义模块 这是我的魔力: package my.maven.plugins.myplugin; import my.maven.plugins.myplugin.component.MyCompone

我现在开发的maven插件使用GoogleGuice和JSR-330注入了一些依赖项。对于单元测试,我使用。这个插件工作得很好。但是测试有一个问题。我想将模拟组件注入mojo,但测试中仍然有真实的对象

我试着按照中所述编写自定义测试模块,但没有成功。经过一些调试,我发现Plexus容器不允许使用自定义模块

这是我的魔力:

package my.maven.plugins.myplugin;

import my.maven.plugins.myplugin.component.MyComponent;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;

import javax.inject.Inject;

@Mojo(name = "resolve-property-value")
public class MyMojo extends AbstractMojo {

    private final MyComponent component;

    @Parameter(readonly = true, defaultValue = "${project}" )
    private MavenProject project;

    @Inject
    public MyMojo(MyComponent component) {
        this.component = component;
    }

    @Override
    public void execute() {
        String value = component.resolvePropertyValue();
        project.getProperties().setProperty("some.property", value);
    }
}
组件的接口:

package my.maven.plugins.myplugin.component;

public interface MyComponent {

    String resolvePropertyValue();
}
和实施

package my.maven.plugins.myplugin.component.impl;

import my.maven.plugins.myplugin.component.MyComponent;

import javax.inject.Named;

@Named
public class MyComponentImpl implements MyComponent {

    @Override
    public String resolvePropertyValue() {
        return "someValue";
    }
}
测试:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>my.maven.plugins</groupId>
    <artifactId>my-plugin</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <packaging>maven-plugin</packaging>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <maven.version>3.6.0</maven.version>
        <maven-test.version>3.3.0</maven-test.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-core</artifactId>
            <version>${maven.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>${maven.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>${maven.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>21.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.resolver</groupId>
            <artifactId>maven-resolver-api</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-compat</artifactId>
            <version>${maven.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- Test dependencies -->
        <dependency>
            <groupId>org.apache.maven.plugin-testing</groupId>
            <artifactId>maven-plugin-testing-harness</artifactId>
            <version>${maven-test.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.23.4</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-plugin-plugin</artifactId>
                    <version>${maven.version}</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

4.0.0
my.maven.plugins
我的插件
0.1.0-SNAPSHOT
maven插件
1.8
1.8
UTF-8
3.6.0
3.3.0
org.apache.maven
马文堆芯
${maven.version}
org.apache.maven
maven插件api
${maven.version}
org.apache.maven.plugin-tools
maven插件注释
${maven.version}
假如
番石榴
番石榴
21
org.apache.maven.resolver
maven解析器api
1.3.1
org.apache.maven
马文同胞
${maven.version}
测试
org.apache.maven.plugin-testing
maven插件测试线束
${maven test.version}
测试
朱尼特
朱尼特
4.12
测试
org.mockito
莫基托磁芯
2.23.4
测试
org.apache.maven.plugins
maven插件
${maven.version}
有没有办法在插件单元测试中使用mockito?

我想没有“神奇”的方法来注入模拟组件。所以我决定在设置部分显式地将其放入容器中

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    mojoRule.getContainer().addComponent(component, MyComponent.class, "");
}

我没有看到任何代码将
组件
mock提供给
MyMojo
类。使用
mojoRule
的对象构造应该如何独立完成这项工作?这是我的问题。我找不到任何指南或例子来说明如何做到这一点。我试图创建一个带有模拟绑定的自定义guice模块,但没有成功。我不确定是否有可能在这里使用mockito。但我认为,因为这是一个单元测试,所以应该有一个解决方案来取代真实的测试component@second非常感谢。我试图找到一些隐含的方法来注入模拟。但是在你的评论之后,我对Plexus容器的方法做了另一个研究,并在我的答案中找到了一个。我对这个解决方案不满意,但会坚持下去。除非你能控制对象的创建,否则你不能真正使用默认情况下提供的“magic”
mockito
。作为后备
反射始终是一种选择,但是这种方法看起来更好。
@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    mojoRule.getContainer().addComponent(component, MyComponent.class, "");
}