Я использую Mockito 5.20.0 для имитации статического метода, но макет закрывается неправильно/высмеиваемое поведение выходит за пределы тестов, к которым оно предназначено. Это проблема, только если MyMockedTest запускается до MyUnmockedTest. Если MyUnmockedTest запускается первым, проблем нет, и оба тестовых класса проходят успешно. Насколько я могу судить, try-with-resources должен закрывать и снимать с насмешки MyUtil, когда MyMockedTest::testStuff завершен, и имитируемое поведение не должно переноситься на другой класс.
Я запускал тесты как в IntelliJ, так и с помощью теста ./gradlew clean build. Тесты не выполняются параллельно.
Наглядный пример кода с отредактированными деталями, надеюсь, он передает суть происходящего:
public class MyUtil {
public static DBConnection getMyDbConnection() {
// ....
// The other code here makes a network call
return new DBConnection();
}
}
import org.mockito.MockedStatic;
import static org.mockito.Mockito.*;
public class MyMockedTest {
@ParameterizedTest
@EnumSource(value = Source.class, names = {"SOURCE_ONE", "SOURCE_TWO"})
public void testStuff() {
// MyUtil has several methods called, and I only want to change the behavior of
// getMyDbConnection.
try (MockedStatic myUtilMockedStatic = mockStatic(MyUtil.class, CALLS_REAL_METHODS)) {
DBConnection dbConnection = mock(DBConnection.class);
when(dbConnection.getConnectionName()).thenReturn("myConnection");
myUtilMockedStatic.when(MyUtil::getMyDbConnection).thenReturn(redshiftConnection);
// MyUtil.getMyDbConnection() is called downstream in code under test
MyFirstClass myFirstClass = new MyFirstClass();
DBConnection results = myFirstClass.getDbConnection()
// Assertion passes
assertEquals(results.getDbConnection().getConnectionName(), "myConnection");
}
}
}
public class MyUnmockedTest {
@ParameterizedTest
@EnumSource(value = Source.class, names = {"SOURCE_ONE", "SOURCE_TWO"})
public void testStuffWithoutMockedUtils() {
MyOtherClass myOtherClass = new MyOtherClass();
// MyUtil.getMyDbConnection() is called downstream in code under test
DBConnection results = myOtherClass.getDbConnection();
// Assertion fails, because the downstream MyUtil.getMyDbConnection() is still returning the mocked DBConnection.
assertNotEquals(results.getDbConnection().getConnectionName(), "myConnection");
}
}
Соответствующий build.gradle Тестовая конфигурация:
test {
useJUnitPlatform {
includeEngines "jqwik", "junit-jupiter"
}
include "**/*Test.class"
}
configurations {
mockitoAgent
}
dependencies {
// ...
testImplementation "org.junit.jupiter:junit-jupiter-api:6.0.1"
testImplementation "org.junit.jupiter:junit-jupiter-params:6.0.1"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:6.0.1"
testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.13.4"
testImplementation "net.jqwik:jqwik:1.9.3"
testImplementation "org.wiremock:wiremock:3.13.1"
testImplementation "org.mockito:mockito-core:5.20.0"
testImplementation "org.mockito:mockito-junit-jupiter:5.20.0"
mockitoAgent("org.mockito:mockito-core:5.20.0") {
transitive = false
}
// ...
}
tasks {
test {
jvmArgs += "-javaagent:${configurations.mockitoAgent.asPath}"
}
}
test {
environment "ENVIRONMENT", "test"
testLogging {
exceptionFormat = 'full'
showStandardStreams = true
events "passed", "skipped", "failed"
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... unit-tests
Поведение Mockito MockStatic просачивается в другие тесты Junit ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1763062789
Anonymous
Я использую Mockito 5.20.0 для имитации статического метода, но макет закрывается неправильно/высмеиваемое поведение выходит за пределы тестов, к которым оно предназначено. Это проблема, только если MyMockedTest запускается до MyUnmockedTest. Если MyUnmockedTest запускается первым, проблем нет, и оба тестовых класса проходят успешно. Насколько я могу судить, try-with-resources должен закрывать и снимать с насмешки MyUtil, когда MyMockedTest::testStuff завершен, и имитируемое поведение не должно переноситься на другой класс.
Я запускал тесты как в IntelliJ, так и с помощью теста ./gradlew clean build. Тесты не выполняются параллельно.
Наглядный пример кода с отредактированными деталями, надеюсь, он передает суть происходящего:
public class MyUtil {
public static DBConnection getMyDbConnection() {
// ....
// The other code here makes a network call
return new DBConnection();
}
}
import org.mockito.MockedStatic;
import static org.mockito.Mockito.*;
public class MyMockedTest {
@ParameterizedTest
@EnumSource(value = Source.class, names = {"SOURCE_ONE", "SOURCE_TWO"})
public void testStuff() {
// MyUtil has several methods called, and I only want to change the behavior of
// getMyDbConnection.
try (MockedStatic myUtilMockedStatic = mockStatic(MyUtil.class, CALLS_REAL_METHODS)) {
DBConnection dbConnection = mock(DBConnection.class);
when(dbConnection.getConnectionName()).thenReturn("myConnection");
myUtilMockedStatic.when(MyUtil::getMyDbConnection).thenReturn(redshiftConnection);
// MyUtil.getMyDbConnection() is called downstream in code under test
MyFirstClass myFirstClass = new MyFirstClass();
DBConnection results = myFirstClass.getDbConnection()
// Assertion passes
assertEquals(results.getDbConnection().getConnectionName(), "myConnection");
}
}
}
public class MyUnmockedTest {
@ParameterizedTest
@EnumSource(value = Source.class, names = {"SOURCE_ONE", "SOURCE_TWO"})
public void testStuffWithoutMockedUtils() {
MyOtherClass myOtherClass = new MyOtherClass();
// MyUtil.getMyDbConnection() is called downstream in code under test
DBConnection results = myOtherClass.getDbConnection();
// Assertion fails, because the downstream MyUtil.getMyDbConnection() is still returning the mocked DBConnection.
assertNotEquals(results.getDbConnection().getConnectionName(), "myConnection");
}
}
Соответствующий build.gradle Тестовая конфигурация:
test {
useJUnitPlatform {
includeEngines "jqwik", "junit-jupiter"
}
include "**/*Test.class"
}
configurations {
mockitoAgent
}
dependencies {
// ...
testImplementation "org.junit.jupiter:junit-jupiter-api:6.0.1"
testImplementation "org.junit.jupiter:junit-jupiter-params:6.0.1"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:6.0.1"
testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.13.4"
testImplementation "net.jqwik:jqwik:1.9.3"
testImplementation "org.wiremock:wiremock:3.13.1"
testImplementation "org.mockito:mockito-core:5.20.0"
testImplementation "org.mockito:mockito-junit-jupiter:5.20.0"
mockitoAgent("org.mockito:mockito-core:5.20.0") {
transitive = false
}
// ...
}
tasks {
test {
jvmArgs += "-javaagent:${configurations.mockitoAgent.asPath}"
}
}
test {
environment "ENVIRONMENT", "test"
testLogging {
exceptionFormat = 'full'
showStandardStreams = true
events "passed", "skipped", "failed"
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79819222/mockito-mockstatic-behavior-leaking-to-other-junit-tests[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия