我尝试在我的Android仪器测试中使用Testcontainers,因为我想在测试我的应用程序之前启动一个Web服务器。
问题是,在instrumentation测试中执行的所有代码都在Android设备或模拟器上运行,因此它无法访问在我的主机上运行的docker守护进程,这导致了当我运行测试并尝试使用Testcontainers库启动容器时出现此异常:
java.lang.IllegalStateException:找不到有效的Docker环境。请查看日志并检查配置
那么,是否有可能在我的机器上而不是在Android设备/模拟器中执行启动Testcontainers的代码,或者是否有一个很好的解决方案?
下面是一个示例类,展示了我正在尝试实现的目标:
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static org.junit.Assert.assertTrue;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.Network;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.utility.DockerImageName;
import android.webkit.WebView;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@RunWith(AndroidJUnit4.class)
public class MyIntegrationTest
{
private GenericContainer<?> webServer;
@BeforeClass
public void
startServer() {
Network network = Network.newNetwork();
webServer = new GenericContainer<>(DockerImageName.parse("nginx:latest"))
.withExposedPorts(80)
.withNetwork(network)
.withNetworkAliases("my-web-server")
.withCommand("nginx", "-g", "daemon off;")
.waitingFor(Wait.forHttp("/"));
webServer.start();
}
@Test
public void testMyWebApp() {
// Load the web application in an Android WebView
getInstrumentation().runOnMainSync(() -> {
WebView webView = new WebView(getInstrumentation().getContext());
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://my-web-server/");
assertTrue(webView.getTitle().contains("Welcome to nginx!"));
});
}
@AfterClass
public void stopServer() {
webServer.stop();
}
}
1条答案
按热度按时间olqngx591#
这里的解决方案是编写一个单独的脚本(例如bash或PowerShell),启动webserver docker容器并等待它。服务器启动后,您就可以启动Android测试了。