RhinoMocks: Корректный способ дразнить метода get свойства

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
12
задан steve_c 16 September 2008 в 23:37
поделиться

3 ответа

Одно быстрое примечание, прежде чем я вскочу в это. Обычно Вы хотите избежать использования "Строгой" насмешки, потому что оно делает для хрупкого теста. Строгая насмешка выдаст исключение, если что-нибудь произойдет, что Вы явно не говорите, что Носорог произойдет. Также я думаю, что можно неправильно понимать точно, что делает Носорог, когда Вы звоните для создания насмешки. Думайте о нем как о пользовательском объекте, который был или получен из или реализует Систему. Введите Вас определенный. Если бы Вы сделали это сами, то это было бы похоже на это:

public class FakeUserType: User
{
    //overriding code here
}

Так как IsAdministrator является, вероятно, просто общественной собственностью на Пользовательском типе, Вы не можете переопределить его в наследовавшемся типе.

Что касается Вашего вопроса существует несколько способов, которыми Вы могли обработать это. Вы могли реализовать IsAdministrator как виртуальное свойство на Вашем пользовательском классе как aaronjensen упомянутый следующим образом:

public class User
{
    public virtual Boolean IsAdministrator { get; set; }
}

Это хорошо подход, но только если Вы планируете наследование от своего Пользовательского класса. Также, если бы Вы wan't для фальсифицирования других участников на этом классе, они должны были бы также быть виртуальными, который является, вероятно, не желаемым поведением.

Другой способ выполнить это с помощью интерфейсов. Если бы это - действительно Пользовательский класс, Вы желаете Дразнить затем, я извлек бы интерфейс из него. Ваш выше примера выглядел бы примерно так:

public interface IUser
{
    Boolean IsAdministrator { get; }
}

public class User : IUser
{
    private UserSecurity _userSecurity = new UserSecurity();

    public Boolean IsAdministrator
    {
        get { return _userSecurity.HasAccess("AdminPermissions"); }
    }
}

public void CreateSomethingIfUserHasAdminPermissions()
{
    IUser user = _mocks.StrictMock<IUser>();
    SetupResult.For(user.IsAdministrator).Return(true);

    // do something with my User object
}

Можно стать более необычными, если Вы хотите при помощи внедрения зависимости и МОК, но основной принцип является тем же через плату. Обычно Вы хотите, чтобы Ваши классы зависели от интерфейсов, а не конкретных реализаций так или иначе.

Я надеюсь, что это помогает. Я использовал RhinoMocks в течение долгого времени на главном проекте теперь, поэтому задайте мне вопросы о TDD и насмешке.

11
ответ дан 2 December 2019 в 21:46
поделиться

Удостоверьтесь, что IsAdministrator является виртуальным.

Кроме того, убедитесь, что Вы называете _mocks. ReplayAll ()

1
ответ дан 2 December 2019 в 21:46
поделиться

_mocks.ReplayAll () ничего не сделает. Это не учитывается только потому, что вы используете SetupResult.For (). Используйте Expect.Call (), чтобы убедиться, что ваш код все делает правильно.

0
ответ дан 2 December 2019 в 21:46
поделиться
Другие вопросы по тегам:

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