我有一个Java代码库,它使用Maven进行依赖项解析和对CI运行测试.经过最近一批开发(大到足以让我们很难确定突破性变化)之后,我的一些测试现在在通过Maven运行时失败NoClassDefFoundError了org.w3c.dom.ElementTraversal.从我的IDE(IntelliJ IDEA)中运行时,相同的测试通过,因此可以以满足所有依赖关系的方式排列类路径.
I believe org.w3c.dom.ElementTraversal exists in xml-apis jar 1.4.01 (which is what I'm depending on - see dependency tree below - as is in my classpath when I run mvn dependency:build-classpath), so I don't see why it apparently doesn't exist. I've tried explicitly adding xml-apis 1.4.01 to my dependencyManagement section (in the parent pom, with a dependency in the child pom, and with all other transitive dependencies on xml-apis excluded) but I still have …
在JUnit 4.10及更低版本中,可以将规则注释为@Rule和@ClassRule.这意味着规则在类之前/之后以及每次测试之前/之后被调用.这样做的一个可能原因是设置昂贵的外部资源(通过@ClassRule调用),然后便宜地重置它(通过@Rule调用).
从JUnit 4.11开始,@ Rule字段必须是非静态的,而@ClassRule字段必须是静态的,因此上述内容不再可能.
有明确的解决方法(例如,明确地将@ClassRule和@Rule职责分离为单独的规则),但是必须强制使用两个规则似乎是一种耻辱.我简要介绍了使用@Rule并推断它是否是第一个/最后一个测试,但我不相信这些信息是可用的(至少,它不能直接在描述中获得).
在JUnit 4.11的单个规则中是否有一种干净整洁的@ClassRule和@Rule功能组合方式?
谢谢,罗恩
我正在使用JUnit 4.8.2驱动一套Selenium测试(实际上是WebDriver支持的Selenium).我希望测试在测试失败时自动截取浏览器的屏幕截图.所有测试都继承自SeleniumBaseTestCase,然后大多数继承自SeleniumBastTestCaseWithCompany(使用@Before和@After创建然后通过Selenium清理常见测试数据的方法).
我已经尝试添加一个子类TestWatchman作为@Rulein SeleniumBaseTestCase,overriding TestWatchman的failed方法来截取屏幕截图.问题是在@After调用方法之前正在运行清理测试数据TestWatchman的failed方法,因此屏幕截图都是清理的最后一步,而不是失败的测试.
寻找到它一点点,看来TestWatchman的apply方法只是调用传递Statement的评估方法(只露法),它调用的@After方法,使TestWatchman(或任何其他Rule)没有机会插入测试的执行之间的任何代码@After据我所知,这些方法.
我也看到了创建自定义Runner以改变Statement创建的s的方法,以便在方法@AfterFailure之前运行使用自定义注释的@After方法(因此可以在这样的@AfterFailure方法中截取屏幕截图),但这依赖于覆盖BlockJUnit4ClassRunner的withAfters方法,这是根据文档建议弃用且由于变为私有,建议使用规则.
我在SO上找到了关于@Rule生命周期的另一个答案,这听起来似乎在JUnit 4.8中可能是不可能的,但在JUnit 4.10中可能是可能的.如果那是正确的那么公平,我只想先确认一下.
任何关于我能够实现我想要的优雅和面向未来的方式的想法将不胜感激!
我有许多RxJava Observables(从Jersey客户端生成,或使用存根Observable.just(someObject)).所有这些都应该只发出一个值.我有一个组件测试,模拟了所有Jersey客户端和使用Observable.just(someObject),我看到了与运行生产代码时相同的行为.
我有几个类作用于这些可观察对象,执行一些计算(和一些副作用 - 我可能会在以后使它们成为直接返回值)并返回空的void observables.
有一次,在一个这样的类中,我试图将我的几个源可观察量压缩起来然后映射它们 - 如下所示:
public Observable<Void> doCalculation() {
return Observable.zip(
getObservable1(),
getObservable2(),
getObservable3(),
UnifyingObject::new
).concatMap(unifyingObject -> unifyingObject.processToNewObservable())
}
// in Unifying Object
public Observable<Void> processToNewObservable() {
// ... do some calculation ...
return Observable.empty();
}
Run Code Online (Sandbox Code Playgroud)
然后将计算类组合在一起并等待:
// Wait for rule computations to complete
List<Observable<Void>> calculations = ...;
Observable.zip(calculations, results -> results)
.toBlocking().lastOrDefault(null);
Run Code Online (Sandbox Code Playgroud)
问题是,processToNewObservable()永远不会被执行.通过消除的过程,我可以看到它就是getObservable1()麻烦 - 如果我用它替换它Observable.just(null),一切都按照我的想象执行(但是我想要一个真值的空值).
重申getObservable1()一下,在生产代码中从Jersey客户端返回一个Observable,但该客户端是Observable.just(someValue)在我的测试中返回的Mockito模拟.
如果我转换getObservable1() …
我有一个PHP库,我已经在packagist.org上发布了.我想从包中排除某些文件(例如几个JAR和我的测试),因此依赖于我的库的人不必下载它们.
我把以下内容放在我的composer.json中:
"archive": {
"exclude": ["/test", "composer.phar", "wiremock"]
}
Run Code Online (Sandbox Code Playgroud)
这似乎并没有改变下载的依赖项的内容.
Composer是否支持我想要的功能?我的归档/排除配置有什么作用?