Output\Input 在 Maven 集成测试期间无法在 Junit 中工作

Output\Input Not working in Junit during Maven Integration Tests

我正在使用 JUnit 和一些我编写、修改或从现有代码库获取的客户端,将集成测试所需的文件推送到我想用来进行集成测试的系统。

这是预集成设置步骤。 Maven 有它自己的 pre-integration 步骤,但我只是觉得它对我 wanted\needed\liked.

来说太不灵活了
@Before
public void preIntegration() throws IOException, JSchException,
        UnsupportedOperationException, IllegalArgumentException,
        SecurityException, URISyntaxException, JSONException,
        RuntimeException, NoSuchAlgorithmException, KeyStoreException,
        KeyManagementException {
    if (!firstTimeSetupDone) {
        testConfig = new Properties();

        testConfig.load(getClass().getResourceAsStream("/test-config"));

        oozieClient = new OozieClientWithBlocking(
                testConfig.getProperty("oozieUrl"));

        BufferedReader in = new BufferedReader(new InputStreamReader(
                System.in));

        System.out.print("Username: ");
        String username = in.readLine();
        System.out.print("Password: ");
        String password = in.readLine();
        System.out.print("Host: ");
        String host = in.readLine();

        secureContext = new SecureContext(username, host);
        secureContext.setPassword(password);
        secureContext.setTrustAllHosts(true);

        assertNotNull("Linux test file present",
                getClass().getResource("/file.txt"));

        URL resourceUrl = getClass().getResource("/file.txt");

        System.out.println("Sending files to linux.");
        Scp.exec(secureContext, resourceUrl.getPath(),
                "/home/myUsername/file.txt");

        SSLContextBuilder sslContextBuilder = new SSLContextBuilder();

        TrustStrategy acceptAnyCertificate = new TrustStrategy() {
            public boolean isTrusted(final X509Certificate[] chain,
                    String authType) throws CertificateException {
                return true;
            }
        };
        sslContextBuilder.loadTrustMaterial(null, acceptAnyCertificate);
        SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
                sslContextBuilder.build());

        BasicCredentialsProvider basicCredentialsProvider = new BasicCredentialsProvider();
        Credentials credentials = new UsernamePasswordCredentials(username,
                password);
        basicCredentialsProvider.setCredentials(AuthScope.ANY, credentials);

        HttpClientBuilder httpClientFactory = HttpClientBuilder.create();

        httpClientFactory
                .setDefaultCredentialsProvider(basicCredentialsProvider);
        httpClientFactory.setSSLSocketFactory(sslConnectionSocketFactory);

        CloseableHttpClient httpClient = httpClientFactory.build();

        hdfsClient = new HDFSRestClient(httpClient,
                testConfig.getProperty("nameNodeHttps"));

        URL jar = getClass().getResource("/Utilities-1.4.0.jar");

        System.out.println("Sending files to hdfs.");
        hdfsClient
                .create(jar.getPath(),
                        "/user/myUsername/java-action-workflow/lib/Utilities-1.4.0.jar");
        properties = new Properties();
        properties.setProperty("user.name", username);
        System.out.println("Prep done.");
        firstTimeSetupDone = true;
    }
}

在 pre-integration @Before 步骤中,我要求提供将用于三个客户端中的两个 (SCP and WebHDFS) 的用户名和密码。今年晚些时候,我们公司可能会实施 Kerberos,这可能会变得不必要;在此期间,这是我发现能让人们开心的唯一方法。是的,我知道我正在绕过 SSL,但我知道我正在连接的服务器,它是一个受到严格防火墙保护的内部网络,这主要是一个概念证明。如果这被考虑投入生产,我会提出问题。

问题:当我 运行 集成测试 Junit class 本身时,一切正常。系统提示我输入用户名和密码,我可以输入它们。 class 中的长测试用例在那之后得到执行,并且我已经验证客户端确实在工作。没问题。然后,当我 运行 使用 "integration-test" 构建 Maven 时,故障安全插件只是 在其测试需要 运行 时停止 。我 运行通过 Eclipse 完成这一切:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------

Header 打印,然后构建似乎 idles\waits\stops。我什至尝试通过 Eclipse 中的其他控制台 windows 查看 JUnit 是否在其他地方吐出 System.out.print 语句。

我猜你 Test 等待的原因是,它期待 inputs。 要发送输入参数,你可以这样做

mvn integration-test -Dusername=XXX -Dpassword=YYYY

要使它与 m2e 一起使用,请在 pom.xml:

中的故障安全插件声明中使用它
<configuration>
                        <systemPropertyVariables>
                        <username>${myUsername}</username>
                        <password>${myPassword}</password>
                        <host>${myHost}</host>
                        </systemPropertyVariables>
            </configuration>

然后将变量放入 'Run As' 配置属性中的 'VM' 字段,如下所示:

-Dusername=myUsername
-Dpassword=myPassword
-Dhost=myHost

然后您将用 System.getProperty 个调用替换 System.in 个调用。 (例如 System.getProperty("username"))。