Здравствуйте!
Кто знает, подскажите пожалуйста, в каком направлении искать причину одной и той же ошибки в работающем коде. Всё дело в том, что пример писался на JUnit 4. Я изучаю по видео и как могу подстраиваю под JUnit 5. Вроде всё сделал. Но выдаёт такую ошибку. Весь код при компиляции нигде не цепляется, всё ровно.
Так а что в коде теста?
Это интерфейс.
package ru.csc.java2014.testing.demo3;
public interface Calculator
{
public double calculate(String expression);
}
Это реализация
package ru.csc.java2014.testing.demo3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.function.DoubleConsumer;
import java.util.stream.Stream;
public class CalculatorCli
{
private final Calculator calculator;
public CalculatorCli(Calculator calculator)
{
this.calculator = calculator;
}
public void runInteractiveSession(Reader reader)
{
runInteractiveSession(reader, System.out::println);
}
public void runInteractiveSession(Reader reader, DoubleConsumer resultConsumer)
{
new BufferedReader(reader).lines()
.flatMap((s) -> Stream.of(s.split(";")))
.filter((s) -> !s.trim().isEmpty())
.mapToDouble(calculator::calculate)
.forEach(resultConsumer);
}
public static void main(String[] args) throws Exception
{
CalculatorCli calculatorCli = new CalculatorCli(new CalculatorImpl());
try (Reader reader = new InputStreamReader(System.in))
{
calculatorCli.runInteractiveSession(reader);
}
}
}
Это тесты
package ru.csc.java2014.testing.demo3;
import org.junit.jupiter.api.BeforeEach;
import org.testng.annotations.Test;
import org.mockito.Mockito;
import java.io.StringReader;
import static org.mockito.Mockito.*;
public class CalculatorCliTest
{
private Calculator calculatorMock;
private CalculatorCli calculatorCli;
@BeforeEach
void setUp()throws Exception
{
calculatorMock = Mockito.mock(Calculator.class);
calculatorCli = new CalculatorCli(calculatorMock);
}
@Test
void empty_expressions_must_be_skipped()
{
calculatorCli.runInteractiveSession(new StringReader(";\n; ;;;\t\n;"));
Mockito.verifyZeroInteractions(calculatorMock);/*verifyZeroInteractions) — он проверяет отсутствие каких-либо
неверифицированных (то есть не подпадающих ни под один из выполненных до этого вызовов verify) обращений
к моему mock-объекту — к любым его методам*/
}
@Test
void each_expression_separated_by_semicolon_must_be_evaluated()
{
calculatorCli.runInteractiveSession(new StringReader("1;2;3;"));
verify(calculatorMock).calculate("1");
verify(calculatorMock).calculate("2");
verify(calculatorMock).calculate("3");
verifyNoMoreInteractions(calculatorMock);
}
@Test
void each_expression_separated_by_semicolon_must_be_evaluated_2()
{
when(calculatorMock.calculate("1")).thenReturn(1d);//когда калькулятор вызывается с параметром "1" надо вернуть 1
when(calculatorMock.calculate("2")).thenReturn(2d);
when(calculatorMock.calculate("3")).thenReturn(3d);
calculatorCli.runInteractiveSession(new StringReader("1;2;3;"));
verify(calculatorMock).calculate("1");
verify(calculatorMock).calculate("2");
verify(calculatorMock).calculate("3");
verifyNoMoreInteractions(calculatorMock);
}
}
Это xml
<?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>ru.csc.java2014</groupId>
<artifactId>testing</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.2.201409121644</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert-core</artifactId>
<version>2.0M10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.8</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
</dependency>
</dependencies>
</project>
Это наверно стоит убрать, вроде бы где-то писалось про проблемы когда одновременно 4 и 5 подключены.
Убирал, не помогает. Я всегда стараюсь перепробовать все приходящие на ум варианты, и только потом обращаться за помощью)))
Я чего только не делал…)
это из 4.
в 5
import org.junit.jupiter.api.Test;
Разрази меня гром!
)))
Спасибо вам огромное.
Я чего только не перепробовал…
Материться хочется…)
Подскажите пожалуйста, где можно посмотреть все переходы по подобным различиям в import?
В 5 вроде бы всё в org.junit.jupiter...
Ну и тут написано что поменялось https://junit.org/junit5/docs/current/user-guide/#migrating-from-junit4
У меня теперь другая кручина)))
Тот проект был на jdk 1.8
Я сейчас сделал точную копию кроме pom-файла на jdk-16, с известной поправкой(спасибо вам), и что вы думаете? Тоже ошибка!
Вот xml
<?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>org.example</groupId>
<artifactId>Test3</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.8.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert-core</artifactId>
<version>2.0M10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.8</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.0-M1</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.soebes.maven.plugins</groupId>
<artifactId>uptodate-maven-plugin</artifactId>
<version>0.2.0</version>
<executions>
<execution>
<goals>
<goal>dependency</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>15</source>
<target>15</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.2.201409121644</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
</properties>
</project>
Вот тест (реализация не трогалась)
package ru.csc.java2014.testing.demo3;
import org.junit.jupiter.api.BeforeEach;
//import org.testng.annotations.Test;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import java.io.StringReader;
import static org.mockito.Mockito.*;
public class CalculatorCliTest
{
private Calculator calculatorMock;
private CalculatorCli calculatorCli;
@BeforeEach
void setUp()throws Exception
{
calculatorMock = Mockito.mock(Calculator.class);
calculatorCli = new CalculatorCli(calculatorMock);
}
@Test
void empty_expressions_must_be_skipped()
{
calculatorCli.runInteractiveSession(new StringReader(";\n; ;;;\t\n;"));
Mockito.verifyZeroInteractions(calculatorMock);/*verifyZeroInteractions) — он проверяет отсутствие каких-либо
неверифицированных (то есть не подпадающих ни под один из выполненных до этого вызовов verify) обращений
к моему mock-объекту — к любым его методам*/
}
@Test
void each_expression_separated_by_semicolon_must_be_evaluated()
{
calculatorCli.runInteractiveSession(new StringReader("1;2;3;"));
verify(calculatorMock).calculate("1");
verify(calculatorMock).calculate("2");
verify(calculatorMock).calculate("3");
verifyNoMoreInteractions(calculatorMock);
}
@Test
void each_expression_separated_by_semicolon_must_be_evaluated_2()
{
when(calculatorMock.calculate("1")).thenReturn(1d);//когда калькулятор вызывается с параметром "1" надо вернуть 1
when(calculatorMock.calculate("2")).thenReturn(2d);
when(calculatorMock.calculate("3")).thenReturn(3d);
calculatorCli.runInteractiveSession(new StringReader("1;2;3;"));
verify(calculatorMock).calculate("1");
verify(calculatorMock).calculate("2");
verify(calculatorMock).calculate("3");
verifyNoMoreInteractions(calculatorMock);
}
}
То же самое за исключением того импорта… Тут в ошибке в основном мокито, но есть и что-то ещё
Слишком старая наверно.
Сейчас 3.11 GitHub - mockito/mockito: Most popular Mocking framework for unit tests written in Java
Верно, 2.25.0 работает
Спасибо.
А как влияет на javax.script.ScriptEngine.eval(String) 16 jdk?
Потому что выдает ошибку на него в другом тесте
java.lang.NullPointerException: Cannot invoke “javax.script.ScriptEngine.eval(String)” because “scriptEngine” is null
Это в реализации.
package ru.csc.java2014.testing.demo3;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class CalculatorImpl implements Calculator
{
/* @Override
public double calculate(String expression)
{
return Double.parseDouble(expression);
}
*/
@Override
public double calculate(String expression)
{
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("nashorn");
try
{
defineMathFunctions(scriptEngine);
return ((Number) scriptEngine.eval(expression)).doubleValue();
}
catch (ScriptException e)
{
throw new IllegalArgumentException("Failed to evaluate expression", e);
}
}
private static void defineMathFunctions(ScriptEngine scriptEngine) throws ScriptException
{
for (String function : new String[] {"sin", "cos", "sqrt"})
{
scriptEngine.eval("function " + function + "(x) { return Java.type('java.lang.Math')." + function + "(x); }");
}
}
}
Там реализуется калькулятор через него.
Так тут видимо просто нет этого Nashorn’a
Nashorn (JavaScript engine) - Wikipedia
With the release of Java 11, Nashorn is deprecated, and has been removed from JDK 15 onwards.
Да, он оказывается теперь не используется. Спасибо.