Maven 如何使用JUnit和tycho surefire插件测试OSGi声明性服务?

Maven 如何使用JUnit和tycho surefire插件测试OSGi声明性服务?,maven,junit,tycho,tycho-surefire-plugin,Maven,Junit,Tycho,Tycho Surefire Plugin,尝试使用JUnit和tycho surefire插件测试OSGi服务 插件的配置 <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-surefire-plugin</artifactId> <version>${tycho.ver

尝试使用JUnit和tycho surefire插件测试OSGi服务

插件的配置

            <plugin>
                <groupId>org.eclipse.tycho</groupId>
                <artifactId>tycho-surefire-plugin</artifactId>
                <version>${tycho.version}</version>
                <configuration>
                    <showEclipseLog>true</showEclipseLog>
                    <dependencies>
                        <dependency>
                            <type>p2-installable-unit</type>
                            <artifactId>org.eclipse.equinox.ds</artifactId>
                        </dependency>
                    </dependencies>
                </configuration>
            </plugin>
Tycho启动一个OSGi容器,即测试包,启动
LdapConnectionConfigurationServiceTest
服务,并正确注入testObject

随后JUnit运行这个测试用例,但创建这个类的另一个实例。没有注入testObject,所以我得到了NullPointerException


不知道我错过了什么。。。我想要的是针对OSGi框架提供的注入服务运行测试用例。

当Tycho“启动
LdapConnectionConfigurationServiceTest
服务”时,这是DS运行时创建注册服务。然而,JUnit测试运行程序根本不知道声明性服务。特别是,它管理自己的对象:它只是使用所有现有
*Test
类的默认构造函数,根据
@Test
创建一个新对象。我希望这能解释发生了什么事。@Andreasewe是的,就是这样。由于JUnit在Tycho的控制下运行,我认为Tycho足够聪明,可以相应地安排测试。使用tycho surefire插件而不是maven surefire插件的全部要点(我的假设)是假定能够将测试过的服务注入JUnit测试用例。FWIW,我认为“将测试过的服务注入JUnit测试用例”不是一个好主意“。原因如下:这使得模拟
testObject
的依赖项变得非常困难;您还需要将模拟项作为服务提供,以便将它们注入
LdapConnectionConfiguration
(同时确保不会意外地注入任何未模拟的依赖项)。此外,您的服务描述符文件现在成为测试用例的一个不可分割但非本地的部分。因此,我宁愿直接调用构造函数,并将所有设置本地到我的
*test
类。当Tycho“启动
LdapConnectionConfigurationServiceTest
服务时,”这是创建注册服务的DS运行时。但是,JUnit测试运行程序根本不知道声明性服务。特别是,它管理自己的对象:它只是使用所有现有
*test
类的默认构造函数来为每个
@test
创建一个新对象。我希望这可以解释发生了什么。@And再次确认是的,这是事实。由于JUnit在Tycho控制下运行,我认为Tycho会足够聪明来相应地安排测试。使用Tycho surefire插件而不是maven surefire插件的整个要点(我的假设)是假设能够将测试过的服务注入JUnit测试用例。FWIW,我认为这样做不是一个好主意“将经过测试的服务注入JUnit测试用例”。原因如下:这使得模拟
testObject
的依赖关系变得非常困难;您需要将模拟也作为服务提供,以便将它们注入
LdapConnectionConfiguration
(同时确保您不会意外地注入任何非模拟依赖项)。此外,您的服务描述符文件现在成为测试用例的一个不可分割但非本地的部分。因此,我宁愿直接调用构造函数,并将所有设置本地到我的
*test
类。
@Component(name = "LdapConnectionConfigurationServiceTest", immediate = true)
public class LdapConnectionConfigurationServiceTest {

    private LdapConnectionConfiguration testObject;


    @Reference
    public void bindTestObject(final LdapConnectionConfiguration testObject) {
        this.testObject = testObject;
    }

    public void unbindTestObject(final LdapConnectionConfiguration testObject) {
        this.testObject = null;
    }

    @Test
    public void testLdapPort() {
        assertEquals(10389, testObject.getLdapPort());
    }

}