2

我已经在 Cobertura 上工作了几个月,最近我收到一条错误消息,说从特定目标位置“读取 .ser 文件时出错”。有谁知道为什么我会收到以下错误:

Cobertura maven插件版本:2.7

Java版本:1.8

    [INFO] Cobertura 2.1.1 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file
[ERROR] Cobertura: Error reading file C:\view\
xyz\target\cobertura\cobertura.s
er: null
java.io.EOFException: null
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputSt
ream.java:2626) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1321) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:20
18) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) ~[na
:1.8.0_102]
        at java.util.HashMap.readObject(HashMap.java:1404) ~[na:1.8.0_102]
        at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:20
18) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:50
3) ~[na:1.8.0_102]
        at net.sourceforge.cobertura.coveragedata.CoverageDataContainer.readObje
ct(CoverageDataContainer.java:321) ~[cobertura-2.1.1.jar:2.1.1]
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) ~[na
:1.8.0_102]
        at java.util.HashMap.readObject(HashMap.java:1404) ~[na:1.8.0_102]
        at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:20
18) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:50
3) ~[na:1.8.0_102]
        at net.sourceforge.cobertura.coveragedata.CoverageDataContainer.readObje
ct(CoverageDataContainer.java:321) ~[cobertura-2.1.1.jar:2.1.1]
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) ~[na
:1.8.0_102]
        at java.util.HashMap.readObject(HashMap.java:1404) ~[na:1.8.0_102]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.
0_102]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:62) ~[na:1.8.0_102]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:20
18) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:50
3) ~[na:1.8.0_102]
        at net.sourceforge.cobertura.coveragedata.CoverageDataContainer.readObje
ct(CoverageDataContainer.java:321) ~[cobertura-2.1.1.jar:2.1.1]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.
0_102]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:62) ~[na:1.8.0_102]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) ~[na
:1.8.0_102]
        at net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler.loadCo
verageData(CoverageDataFileHandler.java:85) ~[cobertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler.loadCo
verageData(CoverageDataFileHandler.java:62) ~[cobertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.dsl.Cobertura.getProjectDataInstance(Cobert
ura.java:146) [cobertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.dsl.Cobertura.report(Cobertura.java:122) [c
obertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.reporting.ReportMain.parseArgumentsAndRepor
t(ReportMain.java:91) [cobertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.reporting.ReportMain.generateReport(ReportM
ain.java:141) [cobertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.reporting.ReportMain.main(ReportMain.java:1
51) [cobertura-2.1.1.jar:2.1.1]
Report time: 1031ms

提前致谢。

4

3 回答 3

1

尝试按照上述更新内存,但这对我们不起作用。但是,通过另一种方式无意中找到了“解决方案”(或至少是补救措施):

我们有大约 60 个测试类,用类级别注释装饰

@RunWith(PowerMockRunner.class)

巧合的是,由于这些类在我们的本地环境中没有显示覆盖范围(实际上使用 EclEmma 进行代码覆盖 - 这与 JaCoCo 相同 - 已知问题),我尝试转换注释......

@RunWith(PowerMockRunner.class)

@RunWith(MockitoJUnitRunner.class)

并且能够转换我们拥有的 60 个中的大约 30 个。虽然我们无法转换所有这些,因为其中一些与测试中的 PowerMock 功能相关,例如允许测试静态方法。但是将注释从 PowerMockRunner 转换为 MockitoJUnitRunner 仍然以某种方式纠正了上述 Cobertura 根据上述错误出错的问题。我仍然无法就为什么会这样给出一个实质性的答案,因为 Cobertura 确实显示了使用 @RunWith(PowerMockRunner.class) 的类的覆盖范围。但是一旦我知道了,我会更新这篇文章。

于 2017-02-15T23:17:27.327 回答
1

通常 .ser 文件只有在没有足够的内存分配给 cobertura 来生成报告时才会被锁定。解决方案应该是

1) 从 src/test/java 中删除所有不必要的测试类文件并运行 cobertura 或

2)增加cobertura的内存大小,如下所示

    <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
            <version>2.7</version>
            <configuration>
                <quiet>true</quiet>
                <cobertura.maxmem>1024m</cobertura.maxmem>
                <instrumentation>
                    <excludes>
                        <exclude>com/homepage/helper/ABC.class</exclude>

                    </excludes>
                    <ignores>
                        <!-- <ignore>com..homepage..helper.ABC</ignore> -->
                    </ignores>
                    <maxmem>1024m</maxmem>
                </instrumentation>
                <argLine>-Xms512m -Xmx2048m -XX:MaxPermSize=1024m</argLine>
                <!-- <argLine>-Xmx2048m</argLine> -->
            </configuration>
            <executions>
                <execution>
                    <id>clean</id>
                    <phase>pre-site</phase>
                    <goals>
                        <goal>clean</goal>
                    </goals>
                </execution>
                <execution>
                    <id>instrument</id>
                    <phase>site</phase>
                    <goals>
                        <goal>instrument</goal>
                        <goal>cobertura</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

在 pom.xml 中,只需将cobertura.maxmem大小更改为我们想要的任何大小,我们还可以选择在生成报告时忽略几个类。

3)还有另一种可能性是您的肯定插件版本不受支持。如果以上两种解决方案都不起作用,请尝试更新如下的肯定版本(maven-surefire-plugin应该是 2.12):

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12</version>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.17</version>
                </dependency>
            </dependencies>             
            <configuration>                     
                     <groups>${testcase.include}</groups>
                     <excludedGroups>${testcase.exclude}</excludedGroups>
            </configuration>

        </plugin>

希望它有用。

于 2017-01-03T09:01:01.810 回答
0

检查文件旁边是否也有 cobertura.ser.lock 文件。如果它存在那么问题是当虚拟机关闭时,cobertura 在运行结束时写出覆盖数据。根据您上过多少节课,可能需要一段时间。如果默认情况下在 30 秒内没有关闭 VM,Surefire 插件将杀死 VM,有时在进程中间使文件处于锁定状态。您可以通过使用surefire 2.20或更高版本并添加更大的关机超时值(forkedProcessExitTimeoutInSeconds)来解决问题。这是一个例子:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20</version>
    <configuration>
         <forkedProcessExitTimeoutInSeconds>120</forkedProcessExitTimeoutInSeconds>
    </configuration>
 </plugin>
于 2019-02-27T14:03:58.733 回答