代码之家  ›  专栏  ›  技术社区  ›  Vijayadhas Chandrasekaran

可以在活动类中测试方法吗?

  •  3
  • Vijayadhas Chandrasekaran  · 技术社区  · 6 年前

    每个人都建议遵循MVP或MVVM模式来维护代码的可读性和可测试性。现在我有疑虑。现在我正在学习单元测试,我正在以一种正式的方式编写代码。不使用任何模式。现在我的问题是,我可以像下面这样测试我的代码吗?

    我的主要活动:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main); 
        }
    
        public boolean testMethod(int value){
           return value== 5?true:false;
        }
    }
    

    我的单元测试课程:

    @RunWith(MockitoJUnitRunner.class)
    public class ExampleUnitTest {
     MainActivity mainActivity = new MainActivity();
    @Test
        public void testMethod(){
            boolean result = mainActivity.testMethod(5);
            assertEquals(true,result);
        }
    }
    

    在运行测试时,我没有收到任何错误或问题。那么这样的测试方法正确吗?或者如果我遵循这个方法会发生什么?我也开始将代码迁移到MVP模式,但我想澄清我的疑虑。请告诉我为什么我不应该遵循单元测试的正式编码。

    1 回复  |  直到 6 年前
        1
  •  7
  •   Maik    6 年前

    您的简单示例可以工作,因为被测试的代码实际上并不依赖于 Activity 类或任何UI状态。试着为实际依赖于UI状态的代码编写一个测试,例如。

    public boolean verifyInput() {
        EditText edit = findViewById(R.id.edit1);
        return edit.getText().toString().startsWith("0");
    }
    

    如果你继续沿着这条路走下去,你会注意到发生了以下事情:

    • 类将变得越来越大(上帝对象反模式)。
    • 实际上依赖于UI状态的代码(您的示例没有)不能用简单的单元测试编写,需要Android工具测试。一、 e.测试将不能再在您的主机上执行,但必须在设备上执行,并且需要设置
    • 由于处理UI操作和状态所需的所有繁重工作的性质,仪器测试通常比较慢,而且可能很不稳定。您将在测试运行中收到误报。

    现在,有一个简单的解决办法。将核心逻辑与UI逻辑分开。使处理UI的代码尽可能简单,并将(复杂的)核心逻辑移到一个单独的类中。突然间,你有了第二个类,它的方法会使你更容易思考和编写测试。第二类也将匹配你的应用程序的用户可以采取的行动。

    过了一段时间,您也会想拆分第二个类,因为您会注意到某些方法子集与另一个方法子集无关。因此,您需要不断地进行模块化和手工化,以使您作为开发人员更容易理解和使用代码。这是像MVP,MVVM。。。会变得很方便。

    请注意,我并不建议您立即使用MVVM之类的模式。如果你刚刚开始学习编程、软件开发或安卓系统,那么做你所做的是完全可以的。通过体验这些“痛点”,我们很多人都已经遇到过这些“痛点”,你将从中学习,并开始寻找改进,以及为什么其他人建议使用特定的模式或最佳实践。

    low coupling and high cohesion 作为一个开发人员,这对你很重要。