Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

We’ll draft out a test defining what we think we want the production code to do

public class TopicScoreWriterTest
{
   @Test
   public   void  verify_topic_score_details_written_out_once()
   {
      // arrange
      String physics = "Physics";

      ArrayList<TopicTopScore> topTopScores = new ArrayList<>();
      topTopScores.add( new TopicTopScore(physics, 89)); 
      
      TopicScoreWriter cut = new TopicScoreWriter();
      
      // act
      cut.writeScores( topTopScores );
      
      // assert
   }
}

Line 10 represents the implementation class. We will call a method called writeScores() passing an array TopicTopScores. Since this method will not return a result that is testable in this context, how are we going to test the result of the writeScrores(), it's going to make a call to a Java API. We are not going to test the Java API call, many millions of developers have already done this. We can use the mocking libraries verify capability. But what are we going to verify?

We’ll begin by decoupling the Java API call to write to the file stream from the TopicScorWriter. To do this could pass into the constructor a java.io.FileWriter object or something similar. But this would tie the production too tightly to java.io.FileWriter. Instead, let’s pass an object that encapsulates the file writer functionality. This object needs to support two capabilities 1) open a text file to write to, and 2) write the formatted string to the opened text file. With this design in mind we can update our test and then dig a little deeper into the implementation code.

Our updated test class now looks like this

public class TopicScoreWriterTest
{
   interface IFileWriter
   {
      void  writeLine( String lineToWrite );
   }
   
   @Test
   public   void  verify_topic_score_details_written_out_once()
   {
      // arrange
      String physics = "Physics";
      String art = "Art";
      String compSci = "Comp Sci";
      String expectedResult = "Physics, 89";

      ArrayList<TopicTopScore> topTopScores = new ArrayList<>();
      topTopScores.add( new TopicTopScore(physics, 89)); 
      
      String fileToWrite = "testfile.txt";
      IFileWriter fileWriter = mock(IFileWriter.class);
      
      TopicScoreWriter cut = new TopicScoreWriter( fileWriter );
      
      // act
      cut.writeScores( topTopScores );
      
      // assert
      verify( fileWriter, times(1)).writeLine(expectedResult);
   }   
}

Notice the use of the interface at line 3. We then use this interface to create Mock object at line 21. At line 29 wr are going to verify that the method writeLine() is called once with a string formatted as shown at line 15.

Let’s write the implementation code.

 
  • No labels