, поскольку я должен изменить атрибут, который таким способом, который замечен всеми экземплярами класса, и в объеме, от которого называют эти методы класса, не имеет ссылок на все экземпляры класса.
у Вас есть доступ по крайней мере к одному экземпляру класса? Я могу думать о способе сделать это тогда:
class MyClass (object):
__var = None
def _set_var (self, value):
type (self).__var = value
def _get_var (self):
return self.__var
var = property (_get_var, _set_var)
a = MyClass ()
b = MyClass ()
a.var = "foo"
print b.var
Другая опция состоит в том, чтобы полагаться на старый добрый вид equals
метод. Пока аргумент в when
насмешка equals
аргумент в протестированном коде, затем Mockito будет соответствовать насмешке.
Вот пример.
public class MyPojo {
public MyPojo( String someField ) {
this.someField = someField;
}
private String someField;
@Override
public boolean equals( Object o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
MyPojo myPojo = ( MyPojo ) o;
return someField.equals( myPojo.someField );
}
}
затем, принимая Вы знаете, каково значение для someField
будет, можно дразнить его как это.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
профессионалы: Это более явно затем any
matchers. Как рецензент кода, я бдительно слежу открытый для any
в записи разработчиков юниора кода, поскольку это посмотрело на логику их кода для генерации соответствующего передаваемого объекта.
довод "против": Иногда поле, передаваемое объекту, является случайным идентификатором. Для этого случая Вы не можете легко создать ожидаемый объект аргумента в своем ложном коде.
Другой возможный подход должен использовать Mockito Answer
объект, который может использоваться с when
метод. Answer
позволяет Вам прервать фактический вызов и осмотреть входной параметр и возвратить фиктивный объект. В примере ниже я использую any
для ловли любого запроса к методу, который дразнят. Но затем в Answer
лямбда, я могу далее осмотреть аргумент Bazo..., возможно, чтобы проверить, что надлежащий идентификатор был передан ему. Я предпочитаю это более чем [1 114] отдельно так, чтобы по крайней мере некоторый контроль был сделан на аргументе.
Bar mockBar = //generate mock Bar.
when(fooDao.getBar(any(Bazo.class))
.thenAnswer( ( InvocationOnMock invocationOnMock) -> {
Bazo actualBazo = invocationOnMock.getArgument( 0 );
//inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
return mockBar;
} );
Так для подведения всего этого мне нравится полагаться equals
(где ожидаемый аргумент и действительный аргумент должны быть равны друг другу), и если равняется, не возможно (из-за неспособности предсказать состояние действительного аргумента), я обращусь к [1 116] для осмотра аргумента.