Может ли Mockito заглушить метод без учета аргумента?

, поскольку я должен изменить атрибут, который таким способом, который замечен всеми экземплярами класса, и в объеме, от которого называют эти методы класса, не имеет ссылок на все экземпляры класса.

у Вас есть доступ по крайней мере к одному экземпляру класса? Я могу думать о способе сделать это тогда:

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
283
задан Eric Wilson 29 November 2012 в 05:24
поделиться

1 ответ

Другая опция состоит в том, чтобы полагаться на старый добрый вид 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] для осмотра аргумента.

0
ответ дан 23 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: