JMockit на «основном» коде - не только в тесте - PullRequest
0 голосов
/ 20 января 2020

Может кто-нибудь сказать, можно ли использовать JMockit в рабочем коде? Он работает, когда я запускаю свой код в разделе «Тесты», но когда я пытаюсь использовать тот же код из «основного», я получаю сообщения о плохой инициализации:

JMockit версия 1.41:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at pac1.main.main(main.java:17)
Caused by: java.lang.IllegalStateException: JMockit didn't get initialized; please check jmockit.jar precedes junit.jar in the classpath
    at mockit.internal.startup.Startup.verifyInitialization(Startup.java:117)
    at mockit.MockUp.<clinit>(MockUp.java:56)
    ... 1 more

JMockit 1.42 и выше - требует использования параметра инициализации JVM "-javaagent":

Exception in thread "main" java.lang.ExceptionInInitializerError
    at pac1.main.main(main.java:17)
Caused by: java.lang.IllegalStateException: JMockit didn't get initialized; please check the -javaagent JVM initialization parameter was used
    at mockit.internal.startup.Startup.verifyInitialization(Startup.java:91)
    at mockit.MockUp.<clinit>(MockUp.java:56)
    ... 1 more

Это рабочий тестовый код:

package pac1;

import java.time.Clock;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;

import mockit.Mock;
import mockit.MockUp;
import org.junit.Test;

public class TestClass {

        @Test
        public void givenLocalDateTimeMock_whenNow_thenGetFixedLocalDateTime() {
            Clock clock = Clock.fixed(Instant.parse("2014-12-22T10:15:30.00Z"), ZoneId.of("UTC"));
            new MockUp<LocalDate>() {
                @Mock
                public LocalDate now() {
                    return LocalDate.now(clock);
                }
            };

            System.out.println(LocalDate.now());
ClasInvokingSomeClass test = new ClasInvokingSomeClass();
test.runApp2();
        }
}

Это не рабочий "рабочий" код:

package pac1;

import java.time.Clock;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;

import mockit.Mock;
import mockit.MockUp;

public class main {

    public static void main(String[] args) {

        Clock clock = Clock.fixed(Instant.parse("2014-12-22T10:15:30.00Z"), ZoneId.of("UTC"));
        new MockUp<LocalDate>() {
            @Mock
            public LocalDate now() {
                return LocalDate.now(clock);
            }
        };

        System.out.println(LocalDate.now());
        ClasInvokingSomeClass test = new ClasInvokingSomeClass();
        test.runApp2();
    }
}

и файл pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.test</groupId>
  <artifactId>test1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>8</source>
          <target>8</target>
        </configuration>
      </plugin>

      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.2</version>
        <configuration>
          <argLine>
            -javaagent:"${settings.localRepository}"/org/jmockit/jmockit/1.49/jmockit-1.49.jar
          </argLine>
        </configuration>
      </plugin>

    </plugins>
  </build>
  <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies -->
  <dependencies>
    <dependency>
      <groupId>org.jmockit</groupId>
      <artifactId>jmockit</artifactId>
      <version>1.42</version>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-all</artifactId>
      <version>1.10.19</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>3.0.5.RELEASE</version>
    </dependency>
  </dependencies>
</project>
...