test_class.declarator: TEST_DATA = "testData"
test_class.modifier: private static final
test_class.original_string: private static final String TEST_DATA = "testData";
test_class.type: String
test_class.var_name: TEST_DATA
test_class.declarator: mThreadPostersTestDouble
test_class.modifier: private
test_class.original_string: private ThreadPostersTestDouble mThreadPostersTestDouble;
test_class.type: ThreadPostersTestDouble
test_class.var_name: mThreadPostersTestDouble
test_class.declarator: mFakeDataFetcherMock
test_class.modifier: private
test_class.original_string: private FakeDataFetcher mFakeDataFetcherMock;
test_class.type: FakeDataFetcher
test_class.var_name: mFakeDataFetcherMock
test_class.declarator: mListener1
test_class.modifier: private
test_class.original_string: private FetchDataUseCase.Listener mListener1;
test_class.type: FetchDataUseCase.Listener
test_class.var_name: mListener1
test_class.declarator: mListener2
test_class.modifier: private
test_class.original_string: private FetchDataUseCase.Listener mListener2;
test_class.type: FetchDataUseCase.Listener
test_class.var_name: mListener2
test_class.declarator: SUT
test_class.modifier: private
test_class.original_string: private FetchDataUseCase SUT;
test_class.type: FetchDataUseCase
test_class.var_name: SUT
test_class.file: sample/src/test/java/com/techyourchance/threadposters/FetchDataUseCaseTest.java
test_class.identifier: FetchDataUseCaseTest
test_case.body: @Test
      public void fetchData_successNoListeners_completesWithoutErrors() throws Exception {
          // Arrange
          success();
          // Act
          SUT.fetchData();
          // Assert
  
          // needs to be called before assertions in order for all threads to complete and
          // all side effects to be present
          mThreadPostersTestDouble.join();
  
          assertThat(true, is(true));
      }
test_case.class_method_signature: FetchDataUseCaseTest.fetchData_successNoListeners_completesWithoutErrors()
test_case.full_signature: @Test public void fetchData_successNoListeners_completesWithoutErrors()
test_case.identifier: fetchData_successNoListeners_completesWithoutErrors
test_case.invocations: success fetchData join assertThat is
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void fetchData_successNoListeners_completesWithoutErrors()
focal_class.declarator: mFakeDataFetcher
focal_class.modifier: private final
focal_class.original_string: private final FakeDataFetcher mFakeDataFetcher;
focal_class.type: FakeDataFetcher
focal_class.var_name: mFakeDataFetcher
focal_class.declarator: mBackgroundThreadPoster
focal_class.modifier: private final
focal_class.original_string: private final BackgroundThreadPoster mBackgroundThreadPoster;
focal_class.type: BackgroundThreadPoster
focal_class.var_name: mBackgroundThreadPoster
focal_class.declarator: mUiThreadPoster
focal_class.modifier: private final
focal_class.original_string: private final UiThreadPoster mUiThreadPoster;
focal_class.type: UiThreadPoster
focal_class.var_name: mUiThreadPoster
focal_class.declarator: mListeners = Collections.newSetFromMap(
              new ConcurrentHashMap<Listener, Boolean>())
focal_class.modifier: private final
focal_class.original_string: private final Set<Listener> mListeners = Collections.newSetFromMap(
              new ConcurrentHashMap<Listener, Boolean>());
focal_class.type: Set<Listener>
focal_class.var_name: mListeners
focal_class.file: sample/src/main/java/com/techyourchance/threadposters/FetchDataUseCase.java
focal_class.identifier: FetchDataUseCase
focal_class.class_method_signature: FetchDataUseCase.FetchDataUseCase(FakeDataFetcher fakeDataFetcher,
                              BackgroundThreadPoster backgroundThreadPoster,
                              UiThreadPoster uiThreadPoster)
focal_class.full_signature: public  FetchDataUseCase(FakeDataFetcher fakeDataFetcher,
                              BackgroundThreadPoster backgroundThreadPoster,
                              UiThreadPoster uiThreadPoster)
focal_class.identifier: FetchDataUseCase
focal_class.modifiers: public
focal_class.parameters: (FakeDataFetcher fakeDataFetcher,
                              BackgroundThreadPoster backgroundThreadPoster,
                              UiThreadPoster uiThreadPoster)
focal_class.signature:  FetchDataUseCase(FakeDataFetcher fakeDataFetcher,
                              BackgroundThreadPoster backgroundThreadPoster,
                              UiThreadPoster uiThreadPoster)
focal_class.class_method_signature: FetchDataUseCase.registerListener(Listener listener)
focal_class.full_signature: public void registerListener(Listener listener)
focal_class.identifier: registerListener
focal_class.modifiers: public
focal_class.parameters: (Listener listener)
focal_class.return: void
focal_class.signature: void registerListener(Listener listener)
focal_class.class_method_signature: FetchDataUseCase.unregisterListener(Listener listener)
focal_class.full_signature: public void unregisterListener(Listener listener)
focal_class.identifier: unregisterListener
focal_class.modifiers: public
focal_class.parameters: (Listener listener)
focal_class.return: void
focal_class.signature: void unregisterListener(Listener listener)
focal_class.class_method_signature: FetchDataUseCase.fetchData()
focal_class.full_signature: public void fetchData()
focal_class.identifier: fetchData
focal_class.modifiers: public
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void fetchData()
focal_class.class_method_signature: FetchDataUseCase.fetchDataSync()
focal_class.full_signature: @WorkerThread private void fetchDataSync()
focal_class.identifier: fetchDataSync
focal_class.modifiers: @WorkerThread private
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void fetchDataSync()
focal_class.class_method_signature: FetchDataUseCase.notifyFailure()
focal_class.full_signature: @UiThread private void notifyFailure()
focal_class.identifier: notifyFailure
focal_class.modifiers: @UiThread private
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void notifyFailure()
focal_class.class_method_signature: FetchDataUseCase.notifySuccess(String data)
focal_class.full_signature: @UiThread private void notifySuccess(String data)
focal_class.identifier: notifySuccess
focal_class.modifiers: @UiThread private
focal_class.parameters: (String data)
focal_class.return: void
focal_class.signature: void notifySuccess(String data)
focal_method.body: public void fetchData() {
          // offload work to background thread
          mBackgroundThreadPoster.post(new Runnable() {
              @Override
              public void run() {
                  fetchDataSync();
              }
          });
      }
focal_method.class_method_signature: FetchDataUseCase.fetchData()
focal_method.full_signature: public void fetchData()
focal_method.identifier: fetchData
focal_method.invocations: post fetchDataSync
focal_method.modifiers: public
focal_method.parameters: ()
focal_method.return: void
focal_method.signature: void fetchData()