<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411016&amp;view=findpost&amp;p=3730266</guid>
        <pubDate>Wed, 28 Jun 2017 18:01:15 +0000</pubDate>
        <title>Junit тестирование</title>
        <link>https://forum.sources.ru/index.php?showtopic=411016&amp;view=findpost&amp;p=3730266</link>
        <description><![CDATA[Сергей737: Разбираюсь с Junit в Eclipse. Eсть LRU и LFU алгоритмы с вложенными классами. Вот LRU класс:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">package Main;</div><div class="code_line">import java.util.LinkedHashMap;</div><div class="code_line">import java.util.Map;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">public class LRUAlgoritm&#60;K, V&#62; implements Cache&#60;K, V&#62;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; private LRUStorage storage; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public LRUAlgoritm(int capacity) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.storage = new LRUStorage(capacity);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;@Override</div><div class="code_line">&nbsp;&nbsp; &nbsp;public V get(K key) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return storage.get(key);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;@Override</div><div class="code_line">&nbsp;&nbsp; &nbsp;public V put(K key, V value) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return storage.put(key,value);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private class LRUStorage extends LinkedHashMap&#60;K, V&#62;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private final int capacity;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private LRUStorage (int capacity){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.capacity = capacity;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;@Override</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;protected boolean removeEldestEntry(Map.Entry&#60;K, V&#62; eldest){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return size()&#62;capacity ; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;@Override</div><div class="code_line">&nbsp;&nbsp; &nbsp;public String toString() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return &nbsp;&quot;storage= &quot; + storage ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Вот LFU класс:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">package Main;</div><div class="code_line">import java.util.LinkedHashMap;</div><div class="code_line">import java.util.Map;</div><div class="code_line">import java.util.Objects;</div><div class="code_line">&nbsp;</div><div class="code_line">public class LFUCache&#60;K, V&#62; implements Cache&#60;K, V&#62; {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final LinkedHashMap&#60;K, Node&#62; storage; //the declaration of the variable &quot;storage&quot; for storing data with key type &quot;K&quot; and value type &quot;Node&quot;.</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int capacity;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public LFUCache(int capacity) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (capacity &#60;= 0) {//validation of the capacity on the negative and the zero value</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new IllegalArgumentException(&quot;Capacity should be more than 0&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.capacity = capacity;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.storage = new LinkedHashMap&#60;&#62;(capacity, 1); //initialization of variable &quot;storage&quot; - data storage. </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//Inside the parentheses: the specified initial capacity and load factor = 1 </div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">//overriding methods &quot;get&quot; and &quot;put&quot; to be implemented from the interface &quot;Cache&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;@Override</div><div class="code_line">&nbsp;&nbsp; &nbsp;public V get(K key) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Node node = storage.get(key);//the get method of LinkedHashMap class according to the</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//&quot;http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html&quot; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//returns &quot;null&quot; if the requested key is missing or </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//has the value - a Hash mapping key if the key exists in the cache storage &quot;storage&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (node == null) {//check the value of the variable &quot;node&quot; to NULL</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return node.incrementFrequency().getValue();//if the value of the variable &quot;node&quot; is not NULL, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//then the called method to increase the frequency on the unit and </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//obtain take associated with the key &quot;key&quot; variable value &quot;value&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;@Override</div><div class="code_line">&nbsp;&nbsp; &nbsp;public V put(K key, V value) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; // &nbsp; if (storage.get(key)!=null&amp;&amp; Objects.equals(value, storage.get(key).getValue()))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//{return storage.get(key).incrementFrequency().getValue();}//verification of the presence of the led element in the cache storage &quot;storage&quot; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//if the element is present then return the value from the cache store</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;doEvictionIfNeeded(key);//verification of occupancy of the cache storage, and the presence of the inserted key in the cache storage &quot;storage&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Node oldNode = storage.put(key, new Node(value));//the put method, inherited from Map interface, returns the previous value associated with key, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//or null if there was no mapping for key</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (oldNode == null) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return oldNode.getValue();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// method to displace the old value with the least frequency when the storage of the cached data is completely filled</div><div class="code_line">&nbsp;&nbsp; &nbsp;private void doEvictionIfNeeded(K putKey) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (storage.size() &#60; capacity) {//verification of occupancy of the cache storage</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;long minFrequency = Long.MAX_VALUE;//the maximum assignable value for a variable of type Long</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;K keyToRemove = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (Map.Entry&#60;K, Node&#62; entry : storage.entrySet()) {//search cash store the minimum value of frequency the &quot;frequency&quot; of all those elements</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (Objects.equals(entry.getKey(), putKey)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//no eviction required cause element already exists, we just need to replace it</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (minFrequency &#62;= entry.getValue().getFrequency()) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;minFrequency = entry.getValue().getFrequency();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;keyToRemove = entry.getKey();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;storage.remove(keyToRemove);//removal item&#39;s key with the minimum number of calls</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">//an inner class &quot;Node&quot; in the object which is stored the value &quot;value&quot;. </div><div class="code_line">&nbsp;&nbsp; &nbsp;//And is created for this value a variable to hold the frequency &quot;frequency&quot; to the value &quot;value&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private class Node { </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private final V value;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private long frequency;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//create a constructor with a parameter (a value of type V) to write the value in the node object.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//And setting the initial value of the frequency of reference to &quot;value&quot; - &quot;frequency&quot; = 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public Node(V value) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.value = value;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.frequency = 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public V getValue() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return value;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public long getFrequency() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return frequency;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public Node incrementFrequency() {// method to increase frequency by one(+1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;++frequency;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return this;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;@Override</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public String toString() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return &quot;Node [value=&quot; + value + &quot;, frequency=&quot; + frequency + &quot;]&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;@Override</div><div class="code_line">&nbsp;&nbsp; &nbsp;public String toString() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return &quot;storage = &quot;+ storage + &quot;, capacity=&quot; + capacity ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
Для LRU алгоритма я сделал тест класс для класса LRUStorage IDE сгенерировала код класса с одним единственным методом:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">package Test;</div><div class="code_line">&nbsp;</div><div class="code_line">import static org.junit.Assert.*;</div><div class="code_line">&nbsp;</div><div class="code_line">import org.junit.Test;</div><div class="code_line">&nbsp;</div><div class="code_line">public class TestLRUAlgoritm {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;@Test</div><div class="code_line">&nbsp;&nbsp; &nbsp;public final void testRemoveEldestEntryEntryOfKV() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fail(&quot;Not yet implemented&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Каким образом его теперь протестировать? метод removeEldestEntry() это переопределенный метод LinkedHashMap ? какие значения ему отдавать, что бы они адекватны для тестирования? Пересмотрел и Ткача, Немчинского и Владыкина на простых примерах какие данные передать и какой ассерт взять понятно(добавляем 2 и 2 и ждем 4), здесь же голову сломал, кучу статей перечитал ничего не понимаю, помогите разобраться?<br>
<br>
я только пытаюсь разобраться, что нужно теститровать и какую именно функциональность необходимо тестировать. В моем примере (class LRUAlgoritm) есть три метода во внешнем классе LRUAlgoritm (get, put, toString) и один во внутреннем классе LRUStorage (remove Eldest Entry). Все они переопределенные. Нужно ли тестировать их логику? Ведь по правилам нужно покрывать тестами 100% кода? Если да, то какие параметры и что на выходе тогда должно быть? <br>
<br>
второй класс дан как разъяснение других примеров, для наглядности.]]></description>
        <author>Сергей737</author>
        <category>Java</category>
      </item>
	
      </channel>
      </rss>
	