Поведение Mockito MockStatic просачивается в другие тесты JunitJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Поведение Mockito MockStatic просачивается в другие тесты Junit

Сообщение 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"
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... unit-tests
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»