2016-05-12 7 views
2

В моем приложении для воспроизведения я намерен издеваться над классом case. Я могу это сделать, но он создает объект со всеми переменными-членами null. Есть ли способ создать макет объектов классов case, чтобы объект мог инициализировать некоторые члены?класс макета в scala: Mockito

case class User(name: String, address: String)  
val mockUser = mock[User] 
user.name // null 
user.address //null 

Как создать mockUser, чтобы я мог присвоить некоторые значения имени и адресу?

Edit:

мне нужна возможность поиздеваться объект, потому что я хочу, чтобы иметь предопределенное поведение одного метода члена. (Этот метод-член вызывает внешнюю службу, и я не хочу внешний вызов службы при выполнении модульного теста.) Метод-член вызывается внутри другого метода-члена, который я хочу проверить.

+0

Является ли это на самом деле полезно для фиктивных классов дела? Вместо создания тестовых экземпляров с поддельными значениями? – cchantep

+0

Мне нужен mock, потому что я не хочу, чтобы определенные методы класса не выполнялись, вместо этого я хочу предопределенное поведение. вопрос обновлен. – konquestor

ответ

5

Вам не нужно будет издеваться над классами корпусов. Это как «насмешка целое».

Что случилось с val mockUser = User("mockName", "mockAddress")?

+0

Мне нужна способность издеваться над объектом, потому что я хочу иметь предопределенное поведение одного из методов-членов. (Этот метод-член вызывает внешнюю службу, и я не хочу внешний вызов службы при выполнении модульного теста.) Метод-член вызывается внутри другого метода-члена, который я хочу проверить. – konquestor

+4

В этом дизайне так много ошибок, я даже не знаю, с чего начать. Вы не должны быть издевательскими классами классов ... Классы классов не должны вызывать внешние службы ... Вы не должны издеваться над объектами, которые вы тестируете ... Призывы к экстерьеру должны быть изолированы, чтобы вы могли их заглушить самостоятельно ... Но на более базовом уровне, как в мире вы планируете «тестировать метод-член» на объекте, который вы просто смеетесь _ ??? – Dima

1

Это должно быть так же просто, как это:

when(mockUser.name).thenReturn("Bob") 

Насколько:

Вы никогда не должны издеваться классы регистра. Это как «насмешка целое число ».

False. (IMHO)

Что не так с val mockUser = Пользователь ("mockName", "mockAddress")?

Ничего, если вы не думаете, есть что-то не так с

val mockFoo = FooWith20Properties("1", "2", "3",..."20") 

Ваши тесты будут работать, но вы пропустили точку с помощью насмешливых рамок, чтобы уменьшить тест шаблонным.

Сказав, что существует разница между теми, кто считает, что классы классов должны быть окончательными, а те, что не нужны. Если вы отметите свою последнюю, а затем издевательскую работу, не прибегая к чему-то столь же противоречивому, как Powermock.

0

Я бы перевел внешний вызов службы из класса case, в класс , а затем издевался над этим классом обслуживания.

Обычно классы шкалы представляют данные. Это приводит к улучшению кода, если данные и функции, которые используют эти данные (например, внешний вызов), являются отдельными.

Я хотел бы написать код, как

case class User(name: String, address: String) 

class UserService { 
    def callExternalService(user: User): Result = ??? 
} 

val testUser = User("somebody", "somewhere") 
val mockService = mock[UserService] 
when(mockService.callExternalService(testUser)).thenReturn(...) 
Смежные вопросы