Iam в настоящее время пытается выполнить модульное тестирование приложения в android. Я использую Dagger 2 для DI. В настоящее время у меня есть класс под названием «ErrorChecker», который я использую для проверки правильности формата электронной почты и пароля определенной длины и т. Д.Лучшая практика для тестирования объекта в android. Должен ли я создавать экземпляр класса в тесте?
В моем классе ErrorChecker есть контекст, который я вставляю. Это в основном используется только для получения строкового ресурса с предупреждением о том, что введенное письмо не было в правильном формате. Id нравится иметь возможность вставлять контекст в версию класса ErrorChecker в моем тесте. Я не уверен, что это абсолютно необходимо? ниже мой тестовый класс.
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class ErrCheckerTest {
private ErrorChecker errchecker;
@Before
public void setup()
{
errchecker = new ErrorChecker();
errchecker.setCont(MyApplication.getInst());
}
@Test
public void validEmailTest()
{
//invalid emails
errchecker.setEmail("notvalidemail");
assertFalse(errchecker.emailValid());
errchecker.setEmail("jimm.***@yahoo.com.com");
assertFalse(errchecker.emailValid());
errchecker.setEmail(".*%&[email protected]");
assertFalse(errchecker.emailValid());
errchecker.setEmail("");
assertFalse(errchecker.emailValid());
errchecker.setEmail("[email protected]");
assertFalse(errchecker.emailValid());
// valid emails
errchecker.setEmail("[email protected]");
assertTrue(errchecker.emailValid());
errchecker.setEmail("[email protected]");
assertTrue(errchecker.emailValid());
errchecker.setEmail("[email protected]");
assertTrue(errchecker.emailValid());
errchecker.setEmail("[email protected]");
assertTrue(errchecker.emailValid());
errchecker.setEmail("[email protected]");
assertTrue(errchecker.emailValid());
}
}
По существу, я просто создаю экземпляр класса, а не вводя его. Я также сделал метод в своем классе ErrorChecker, чтобы установить контекст. Затем я передаю ему статический экземпляр MyApplication с помощью MyApplication.getInst(), который расширяет класс Application. Я думаю, что это способ Okay для создания моего класса ErrorChecker с контекстом, или я должен попытаться его вставить. Это потребует большого количества дополнительного шаблона кода, но, вероятно, будет выглядеть более чистым. Id нравится следовать лучшей практике, поэтому, если кто-нибудь скажет мне, что этот подход нарушает передовой опыт или может предложить другой способ создания класса ErrorChecker в моем тестовом идентификаторе, действительно оцените его!
Да, ваше право. Я использую контекст во многих своих классах, чтобы установить сообщение об ошибке, как правило, в моем классе Model. Я пытаюсь сделать класс представления «немым», поэтому я стараюсь, чтобы он обрабатывал как можно меньше логики. поэтому я установил Error (который я получаю из ресурса String) в моей модели. Я мог бы изменить код, но тогда Iam обрабатывал логику без UI в представлении и нарушал бы MVP. Это мое мышление в любом случае, но я всегда готов к предложениям. –
Кроме того, мои тесты находятся в другом пакете для моего основного, где все мои компоненты и т. Д. Прежде чем я не могу вложить свои Mocks в мои тесты, поскольку я не могу ссылаться на классы My Test в моем основном пакете. –
Как вы вставляете контекст в ErrorChecker. Не могли бы вы вставить его в конструктор ErrorChecker, чтобы вы могли использовать макет контекста в своем тесте. –