Почему имитируемые объекты кажутся заблокированными после создания тестового класса и null в методах @Produced, если имитируют аннотацию @Mock
public class MyTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Rule
public WeldInitiator weld = WeldInitiator.from(MyTest.class).build();
//@Mock <-- this wont work. Will be null in the @Produces methods
private ClassThatSutInjects sutInject= mock(ClassThatSutInjects.class);
private NeedsTest sut;
@Before
public void setup() {
sut = weld.select(NeedsTest.class).get();
}
@Test
public void doesThisWork() {
//Arrange
//Mockito.when(sutInject.multiply(anyInt()))
// .thenReturn(3);//this has no effect on the mock returned by @Produces
//Act
sut.doThis(1234);
//Assert
}
@Produces
public ClassThatSutInjects mockThatClass() {
Mockito.when(sutInject.multiply(anyInt())).thenReturn(100); //<-- this works
return sutInject;
}
}
public class NeedsTest {
@Inject
ClassThatSutInjects someClass
public void doThis(int number) {
return someClass.multiply(number);
}
}
Меня озадачивают две вещи, в понимании которых мне хотелось бы помочь:
1) @Mock (аннотированные поля) имеют значение null внутри методов @Producer, но инициализируются, если вместо этого я использую = Mockito.mock (xxx.class). Насколько я понимаю, это связано с тем, когда используется нотация, а не когда применяется @Rule. Будем признательны за более подробную информацию ...
2) Я бы очень хотел, чтобы макет делал разные вещи в разных тестовых примерах, но это кажется невозможным, поскольку методы @Produces «застряли в прошлом», когда mockito.when () не применялся еще. Как можно "устроить" пр. прецедент? Имея один пр. test-case со временем станет не обслуживаемым ... из-за большого количества кода.
РЕДАКТИРОВАТЬ: Я обнаружил, что создание статичных фиктивных объектов позволяет настроить мой фиктивный объект pr. Метод испытания. Я выполнил отладку и заметил, что объект, возвращенный производителем, не был тем же экземпляром, который использовался в jUnit @Test - очевидно, @Produces запущен в другом экземпляре класса MyTest ... все еще не имеет для меня смысла , так что еще: если у кого-то есть знания, поделитесь, пожалуйста.
Как вы уже заметили, производитель запускается на другом экземпляре объекта.
Source
(Глава 8.1 Объем метода производителя):
Метод-производитель не наследует область действия bean-компонента, объявляющего метод. Здесь есть два разных bean-компонента : метод-производитель и bean-компонент, который его объявляет. Область действия метода производителя определяет, как часто метод будет вызываться, и жизненный цикл объектов, возвращаемых методом. Область действия bean-компонента, объявляющего метод производителя, определяет жизненный цикл объекта, для которого вызывается метод производителя.
Создание статического поля работает вокруг этого, но на самом деле это не очень хорошее решение.
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения