Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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 JMockIt安全异常签名者信息不匹配_Java_Testing_Certificate_Jmockit_Securityexception - Fatal编程技术网

Java JMockIt安全异常签名者信息不匹配

Java JMockIt安全异常签名者信息不匹配,java,testing,certificate,jmockit,securityexception,Java,Testing,Certificate,Jmockit,Securityexception,当运行JMockIt并尝试在testng中模拟从已签名jar加载的实例时,我会遇到以下错误(在jetty服务器的示例中): pom中的依赖顺序是正确的,没有模拟,测试可以正常运行。因此,这里的提示不起作用 有解决办法吗 这是一个样本测试,应该会产生错误。在这种情况下,我们为集成测试启动整个容器: public class MyServletTest { private final Server server = new Server(PORT); private MockUp&

当运行JMockIt并尝试在testng中模拟从已签名jar加载的实例时,我会遇到以下错误(在jetty服务器的示例中):

pom中的依赖顺序是正确的,没有模拟,测试可以正常运行。因此,这里的提示不起作用

有解决办法吗


这是一个样本测试,应该会产生错误。在这种情况下,我们为集成测试启动整个容器:

public class MyServletTest {
    private final Server server = new Server(PORT);
    private MockUp<OpenIDAuthenticationProvider> openIDap;

    @BeforeClass
    public void startServer() throws Exception {
        final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        context.addServlet(MyServlet.class, "/my/*");
        this.server.setHandler(context);
        this.server.start();
        this.openIDap = new MockUp<OpenIDAuthenticationProvider>() {
            @Mock
            void $init(final UserDAO userDao) {}
        };
    }

    @Test
    ...
}
公共类MyServletTest{
专用最终服务器=新服务器(端口);
私有实体模型openIDap;
@课前
public void startServer()引发异常{
最终ServletContextHandler上下文=新的ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(“/”);
addServlet(MyServlet.class,“/my/*”);
this.server.setHandler(上下文);
这是.server.start();
this.openIDap=new MockUp(){
@嘲弄
void$init(最终UserDAO UserDAO){}
};
}
@试验
...
}
OpenIDAuthenticationProvider是从MyServlet内部调用的,并在启动期间实例化,尽管我不确定这是否重要

pom.xml中的相应部分如下所示:

<dependencies>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlet</artifactId>
        <version>9.0.3.v20130506</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>9.0.3.v20130506</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

org.eclipse.jetty
码头servlet
9.0.3.v20130506
测试
org.eclipse.jetty
jetty服务器
9.0.3.v20130506
测试
javax.servlet
servlet api
2.5
假如

一种方法是使用JMockIt停用证书检查。因为JMockIt(和其他模拟框架)是通过插装工作的,所以任何类都可以修改。下面是一个关于如何模拟类加载器中导致问题的部分的示例:

@BeforeSuite
public void deactivateCertChecker() {
    new MockUp<ClassLoader>() {
        @Mock
        void checkCerts(final String name, final CodeSource cs) {}
    };
}
@BeforeSuite
公共无效停用ecertchecker(){
新模型(){
@嘲弄
无效检查证书(最终字符串名称,最终代码源cs){}
};
}

但是请注意,这不是实际运行有签名问题的程序的修复方法,因为只有在测试运行期间,当检测到模拟时,效果才可用。

一种方法是使用JMockIt停用证书检查。因为JMockIt(和其他模拟框架)是通过插装工作的,所以任何类都可以修改。下面是一个关于如何模拟类加载器中导致问题的部分的示例:

@BeforeSuite
public void deactivateCertChecker() {
    new MockUp<ClassLoader>() {
        @Mock
        void checkCerts(final String name, final CodeSource cs) {}
    };
}
@BeforeSuite
公共无效停用ecertchecker(){
新模型(){
@嘲弄
无效检查证书(最终字符串名称,最终代码源cs){}
};
}

但是请注意,这不是实际运行有签名问题的程序的修复方法,因为只有在测试运行期间,当检测到模拟时,效果才可用。

您能显示一个复制异常的测试吗?或者,在运行模拟jar类的测试时,在类路径中有任何已签名的jar就足够了吗?我猜任何包含检查签名的组件的jar都会导致这个问题。我在测试中使用了上面的代码(测试类和pom.xml片段),但没有出现错误。另外,
OpenIDAuthenticationProvider
来自Spring Security,但上面不包括此依赖项。这同样适用于
FilterRegistration
接口,该接口来自另一个Jetty依赖项。如果愿意,请在JMockit问题跟踪程序中打开一个新问题,并提供更完整的信息。实际上,不,OpenIDAuthenticationProvider是我们的自定义实现,我们在项目中不使用spring。javax.servlet.FilterRegistration是javax.servlet api的一部分,该api在jetty实例下面定义。感谢您的提议,但我实际上更喜欢下面的修复,因为不仅JMockIt会影响签名,这只是出现这种情况的一种。我猜您没有收到异常的原因可能是因为spring OpenIDAuthenicationProvider有一个空的默认构造函数,这就是为什么用另一个空的来模拟它可能不会修改结果jar签名的原因。我们的实现在构造函数中做了一些事情,mock是一个可以注册的更改。您能展示一个复制异常的测试吗?或者,在运行模拟jar类的测试时,在类路径中有任何已签名的jar就足够了吗?我猜任何包含检查签名的组件的jar都会导致这个问题。我在测试中使用了上面的代码(测试类和pom.xml片段),但没有出现错误。另外,
OpenIDAuthenticationProvider
来自Spring Security,但上面不包括此依赖项。这同样适用于
FilterRegistration
接口,该接口来自另一个Jetty依赖项。如果愿意,请在JMockit问题跟踪程序中打开一个新问题,并提供更完整的信息。实际上,不,OpenIDAuthenticationProvider是我们的自定义实现,我们在项目中不使用spring。javax.servlet.FilterRegistration是javax.servlet api的一部分,该api在jetty实例下面定义。感谢您的提议,但我实际上更喜欢下面的修复,因为不仅JMockIt会影响签名,这只是出现这种情况的一种。我猜您没有收到异常的原因可能是因为spring OpenIDAuthenicationProvider有一个空的默认构造函数,这就是为什么用另一个空的来模拟它可能不会修改结果jar签名的原因。我们的实现是在构造函数中完成的,因此mock是一个可以注册的更改。