Back to Repositories

Testing ViewCollections Property and Action Handling in Butterknife

This test suite validates the ViewCollections utility class in Butterknife, focusing on property setting, action execution, and setter operations across Android Views. It ensures proper functionality for both individual views and collections of views through comprehensive unit testing.

Test Coverage Overview

The test suite provides extensive coverage of ViewCollections functionality:

  • Property application to single views and view collections
  • Action execution on individual and multiple views
  • Setter operations across different view configurations
  • Testing of both array and list-based view collections

Implementation Analysis

The testing approach utilizes JUnit with a focus on behavioral verification. Each test method follows a clear arrange-act-assert pattern, using the Truth assertion library for readable test assertions. The implementation validates both single and multiple property/action applications across different view container types.

Technical Details

Key technical components include:

  • JUnit test framework
  • Android Instrumentation testing
  • Google Truth assertion library
  • Custom Property and Action implementations
  • View state manipulation through enable/disable and alpha properties

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Consistent test method naming convention
  • Thorough state verification before and after actions
  • Isolated test cases for each functionality
  • Clear separation of setup and verification steps
  • Comprehensive edge case coverage

jakewharton/butterknife

butterknife-runtime/src/androidTest/java/butterknife/ViewCollectionsTest.java

            
package butterknife;

import android.content.Context;
import android.util.Property;
import android.view.View;
import androidx.test.InstrumentationRegistry;
import java.util.List;
import org.junit.Test;

import static com.google.common.truth.Truth.assertThat;
import static java.util.Arrays.asList;

public class ViewCollectionsTest {
  private static final Property<View, Boolean> PROPERTY_ENABLED =
      new Property<View, Boolean>(Boolean.class, "enabled") {
        @Override public Boolean get(View view) {
          return view.isEnabled();
        }

        @Override public void set(View view, Boolean enabled) {
          view.setEnabled(enabled);
        }
      };
  private static final Setter<View, Boolean> SETTER_ENABLED =
      (view, value, index) -> view.setEnabled(value);
  private static final Action<View> ACTION_DISABLE = (view, index) -> view.setEnabled(false);
  private static final Action<View> ACTION_ZERO_ALPHA = (view, index) -> view.setAlpha(0f);

  private final Context context = InstrumentationRegistry.getContext();

  @Test public void propertyAppliedToView() {
    View view = new View(context);
    assertThat(view.isEnabled()).isTrue();

    ViewCollections.set(view, PROPERTY_ENABLED, false);
    assertThat(view.isEnabled()).isFalse();
  }

  @Test public void propertyAppliedToEveryViewInList() {
    View view1 = new View(context);
    View view2 = new View(context);
    View view3 = new View(context);
    assertThat(view1.isEnabled()).isTrue();
    assertThat(view2.isEnabled()).isTrue();
    assertThat(view3.isEnabled()).isTrue();

    List<View> views = asList(view1, view2, view3);
    ViewCollections.set(views, PROPERTY_ENABLED, false);

    assertThat(view1.isEnabled()).isFalse();
    assertThat(view2.isEnabled()).isFalse();
    assertThat(view3.isEnabled()).isFalse();
  }

  @Test public void propertyAppliedToEveryViewInArray() {
    View view1 = new View(context);
    View view2 = new View(context);
    View view3 = new View(context);
    assertThat(view1.isEnabled()).isTrue();
    assertThat(view2.isEnabled()).isTrue();
    assertThat(view3.isEnabled()).isTrue();

    View[] views = new View[] { view1, view2, view3 };
    ViewCollections.set(views, PROPERTY_ENABLED, false);

    assertThat(view1.isEnabled()).isFalse();
    assertThat(view2.isEnabled()).isFalse();
    assertThat(view3.isEnabled()).isFalse();
  }

  @Test public void actionAppliedToView() {
    View view = new View(context);
    assertThat(view.isEnabled()).isTrue();

    ViewCollections.run(view, ACTION_DISABLE);

    assertThat(view.isEnabled()).isFalse();
  }

  @Test public void actionsAppliedToView() {
    View view = new View(context);
    assertThat(view.isEnabled()).isTrue();
    assertThat(view.getAlpha()).isEqualTo(1f);

    ViewCollections.run(view, ACTION_DISABLE, ACTION_ZERO_ALPHA);
    assertThat(view.isEnabled()).isFalse();
    assertThat(view.getAlpha()).isEqualTo(0f);
  }

  @Test public void actionAppliedToEveryViewInList() {
    View view1 = new View(context);
    View view2 = new View(context);
    View view3 = new View(context);
    assertThat(view1.isEnabled()).isTrue();
    assertThat(view2.isEnabled()).isTrue();
    assertThat(view3.isEnabled()).isTrue();

    List<View> views = asList(view1, view2, view3);
    ViewCollections.run(views, ACTION_DISABLE);

    assertThat(view1.isEnabled()).isFalse();
    assertThat(view2.isEnabled()).isFalse();
    assertThat(view3.isEnabled()).isFalse();
  }

  @Test public void actionAppliedToEveryViewInArray() {
    View view1 = new View(context);
    View view2 = new View(context);
    View view3 = new View(context);
    assertThat(view1.isEnabled()).isTrue();
    assertThat(view2.isEnabled()).isTrue();
    assertThat(view3.isEnabled()).isTrue();

    View[] views = new View[] { view1, view2, view3 };
    ViewCollections.run(views, ACTION_DISABLE);

    assertThat(view1.isEnabled()).isFalse();
    assertThat(view2.isEnabled()).isFalse();
    assertThat(view3.isEnabled()).isFalse();
  }

  @Test public void actionsAppliedToEveryViewInList() {
    View view1 = new View(context);
    View view2 = new View(context);
    View view3 = new View(context);
    assertThat(view1.isEnabled()).isTrue();
    assertThat(view2.isEnabled()).isTrue();
    assertThat(view3.isEnabled()).isTrue();
    assertThat(view1.getAlpha()).isEqualTo(1f);
    assertThat(view2.getAlpha()).isEqualTo(1f);
    assertThat(view3.getAlpha()).isEqualTo(1f);

    List<View> views = asList(view1, view2, view3);
    ViewCollections.run(views, ACTION_DISABLE, ACTION_ZERO_ALPHA);

    assertThat(view1.isEnabled()).isFalse();
    assertThat(view2.isEnabled()).isFalse();
    assertThat(view3.isEnabled()).isFalse();
    assertThat(view1.getAlpha()).isEqualTo(0f);
    assertThat(view2.getAlpha()).isEqualTo(0f);
    assertThat(view3.getAlpha()).isEqualTo(0f);
  }

  @Test public void actionsAppliedToEveryViewInArray() {
    View view1 = new View(context);
    View view2 = new View(context);
    View view3 = new View(context);
    assertThat(view1.isEnabled()).isTrue();
    assertThat(view2.isEnabled()).isTrue();
    assertThat(view3.isEnabled()).isTrue();
    assertThat(view1.getAlpha()).isEqualTo(1f);
    assertThat(view2.getAlpha()).isEqualTo(1f);
    assertThat(view3.getAlpha()).isEqualTo(1f);

    View[] views = new View[] { view1, view2, view3 };
    ViewCollections.run(views, ACTION_DISABLE, ACTION_ZERO_ALPHA);

    assertThat(view1.isEnabled()).isFalse();
    assertThat(view2.isEnabled()).isFalse();
    assertThat(view3.isEnabled()).isFalse();
    assertThat(view1.getAlpha()).isEqualTo(0f);
    assertThat(view2.getAlpha()).isEqualTo(0f);
    assertThat(view3.getAlpha()).isEqualTo(0f);
  }

  @Test public void setterAppliedToView() {
    View view = new View(context);
    assertThat(view.isEnabled()).isTrue();

    ViewCollections.set(view, SETTER_ENABLED, false);

    assertThat(view.isEnabled()).isFalse();
  }

  @Test public void setterAppliedToEveryViewInList() {
    View view1 = new View(context);
    View view2 = new View(context);
    View view3 = new View(context);
    assertThat(view1.isEnabled()).isTrue();
    assertThat(view2.isEnabled()).isTrue();
    assertThat(view3.isEnabled()).isTrue();

    List<View> views = asList(view1, view2, view3);
    ViewCollections.set(views, SETTER_ENABLED, false);

    assertThat(view1.isEnabled()).isFalse();
    assertThat(view2.isEnabled()).isFalse();
    assertThat(view3.isEnabled()).isFalse();
  }

  @Test public void setterAppliedToEveryViewInArray() {
    View view1 = new View(context);
    View view2 = new View(context);
    View view3 = new View(context);
    assertThat(view1.isEnabled()).isTrue();
    assertThat(view2.isEnabled()).isTrue();
    assertThat(view3.isEnabled()).isTrue();

    View[] views = new View[] { view1, view2, view3 };
    ViewCollections.set(views, SETTER_ENABLED, false);

    assertThat(view1.isEnabled()).isFalse();
    assertThat(view2.isEnabled()).isFalse();
    assertThat(view3.isEnabled()).isFalse();
  }
}