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

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

Сообщение Anonymous »

Я использую Mockito 5.20.0 для имитации статического метода, но макет закрывается неправильно/высмеиваемое поведение выходит за пределы тестов, к которым оно предназначено. Это проблема, только если MyMockedTest запускается до MyUnmockedTest. Если MyUnmockedTest запускается первым, проблем нет, и оба тестовых класса проходят успешно. Насколько я могу судить, попытка с ресурсами должна закрывать и снимать издевательство над MyUtil, когда MyMockedTest::testStuff завершено, и издеваемое поведение не должно переноситься в другой класс. Иллюстративный пример кода с отредактированными деталями, надеюсь, он передает суть происходящего:
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");
}
}


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

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

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

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

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

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