在android中测试对象的最佳实践。我应该在测试中实例化类吗?

在android中测试对象的最佳实践。我应该在测试中实例化类吗?,android,unit-testing,robolectric,dagger-2,Android,Unit Testing,Robolectric,Dagger 2,Iam目前正在尝试在android中对应用程序进行单元测试。我用匕首2来对付DI。我现在有一个叫做“ErrorChecker”的类,我用它来检查电子邮件的格式是否有效,密码是否有一定的长度等等 在我的ErrorChecker类中有一个我注入的上下文。这基本上只用于在输入的电子邮件格式不正确时获取带有警告的字符串资源。我希望能够在我的测试中将上下文注入到ErrorChecker类的版本中。我不确定这是否绝对必要?。下面是我的测试课 @RunWith(RobolectricGradleTestRun

Iam目前正在尝试在android中对应用程序进行单元测试。我用匕首2来对付DI。我现在有一个叫做“ErrorChecker”的类,我用它来检查电子邮件的格式是否有效,密码是否有一定的长度等等

在我的ErrorChecker类中有一个我注入的上下文。这基本上只用于在输入的电子邮件格式不正确时获取带有警告的字符串资源。我希望能够在我的测试中将上下文注入到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(".*%&$$$$$.@fish.ie");
    assertFalse(errchecker.emailValid());
    errchecker.setEmail("");
    assertFalse(errchecker.emailValid());
    errchecker.setEmail("jimm.@yaaaaaa");
    assertFalse(errchecker.emailValid());


    // valid emails

    errchecker.setEmail("eoin@yahoo.com");
    assertTrue(errchecker.emailValid());
    errchecker.setEmail("eoin@myemail.co.uk");
    assertTrue(errchecker.emailValid());
    errchecker.setEmail("paul.murphy@mygit.ie");
    assertTrue(errchecker.emailValid());
    errchecker.setEmail("karen.greene@hello.ie");
    assertTrue(errchecker.emailValid());
    errchecker.setEmail("orla@yahoo.ie");
    assertTrue(errchecker.emailValid());

  }
}

本质上,我只是实例化这个类,而不是注入它。我还在ErrorChecker类中创建了一个方法,以便设置上下文。然后,我使用MyApplication.getInst()将MyApplication的静态实例传递给它,该实例扩展了Application类。我想知道这是用上下文创建ErrorChecker类的好方法,还是应该尝试注入它。这将需要大量额外的样板代码,但可能看起来更干净。我想遵循最佳实践,所以如果有人能告诉我这种方法是否违反了最佳实践,或者可以建议在我的测试中创建ErrorChecker类的不同方法,我真的很感激

您真的需要在类ErrorChecker中传递上下文吗?我认为ErrorChecker应该只验证您的数据是否正确。如果数据不正确,您的视图应负责获取并显示消息。

是的,您是对的。我在很多类中使用上下文来设置错误消息,通常是在模型类中。我试图使视图类成为一个“哑”视图,所以我试图让它处理尽可能少的逻辑。因此,我在模型中设置了错误(从字符串资源中获取)。我可以改变代码,但我会在视图中处理非UI逻辑,这将违反MVP。这是我的想法,但我总是乐于接受建议。而且我的测试与我的主测试不同,我的所有组件都在主测试包中。在此之前,我无法将模拟注入测试,因为我无法引用主包中的测试类。如何将上下文注入ErrorChecker。你不能将其注入ErrorChecker的构造函数中,以便在测试中使用模拟上下文。不能在我的组件中调用“void inject(TestErrorChecker errchecker)”,因为该组件位于主包中。所以我不能在我的主包中引用测试类,因为测试在测试包中。有点痛。我可以将模块设置为返回模拟上下文,但我需要重新构造整个内容。或者我可以尝试在测试包中扩展我的组件。看看这是否有效。反正都很好玩!